Люди помогите ReadFile C++ ну не как ....

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Fl0dER, 22 Feb 2010.

  1. Fl0dER

    Fl0dER New Member

    Joined:
    22 Dec 2008
    Messages:
    81
    Likes Received:
    3
    Reputations:
    0
    День добрый , вобщем появилась такая проблема , пытаюсь писать на чистом WinApi , надо прочитать файл вот собствено код , что не так

    Code:
    LPCSTR ReadFromFile()
    {
        HANDLE FileHandle;
        DWORD R;
        DWORD Size;
        char Line[256];
        FileHandle = CreateFileA("C:\\file.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        Size = GetFileSize(FileHandle, &Size);
        ReadFile(FileHandle, Line, Size, &R, NULL);
        return Line;
    }
    
    
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    
    	MessageBox(0,ReadFromFile(),"",0);
    
    }
    
    в файле текст 1234567 , а выводит хрень какуюта , разьясните как правльно заюзать функцию ReadFile чтобы прочитать текстовой файл
     
  2. BastardFromHell

    Joined:
    5 Feb 2010
    Messages:
    50
    Likes Received:
    18
    Reputations:
    6
    Code:
    #include <windows.h>
    #include <iostream.h>
    
    
    int main()
    {
      HANDLE  hFile;     // дескриптор файла
      HANDLE  hEndRead;  // дескриптор события
      OVERLAPPED  ovl;   // структура управления асинхронным доступом к файлу
    
      // создаем события с автоматическим сбросом
      hEndRead = CreateEvent(NULL, FALSE, FALSE, NULL);
      if (hEndRead == NULL)
        return GetLastError();
        
      // инициализируем структуру OVERLAPPED
      ovl.Offset = 0;         // младшая часть смещения равна 0
      ovl.OffsetHigh = 0;      // старшая часть смещения равна 0
      ovl.hEvent = hEndRead;   // событие для оповещения завершения чтения
    
      // открываем файл для чтения
      hFile = CreateFile(
        "C:\\C:\\file.txt",   // имя файла
        GENERIC_READ,          // чтение из файла
        FILE_SHARE_READ,       // совместный доступ к файлу
        NULL,                  // защиты нет
        OPEN_EXISTING,         // открываем существующий файл
        FILE_FLAG_OVERLAPPED,  // асинхронный ввод
        NULL                   // шаблона нет
      );
      // проверяем на успешное открытие
      if (hFile == INVALID_HANDLE_VALUE)
      {
        cerr << "Create file failed." << endl
          << "The last error code: " << GetLastError() << endl;
    
        CloseHandle(hEndRead);
    
        cout << "Press any key to finish.";
        cin.get();
    
        return 0;
      }
      // читаем данные из файла
      for (;;)
      {
        DWORD  dwBytesRead;
        DWORD  dwRet;
        int    n;
    
        // читаем одну запись
        if (!ReadFile(
            hFile,           // дескриптор файла
            &n,              // адрес буфера, куда читаем данные
            sizeof(n),       // количество читаемых байтов
            &dwBytesRead,    // количество прочитанных байтов
            &ovl             // чтение асинхронное
          ))
        {
          switch(dwRet = GetLastError())
          {
          case ERROR_IO_PENDING:
            cout << "Read file pending." << endl;
            break;
          case ERROR_HANDLE_EOF:
            cout << endl << "End of the file." << endl;
            cout << "The file is read." << endl;
    
            // закрываем дескрипторы
            CloseHandle(hFile);
            CloseHandle(hEndRead);
    
            return 1;
          default:
            cout << "Read file failed." << endl
              << "The last error code: " << dwRet << endl;
    
            // закрываем дескрипторы
            CloseHandle(hFile);
            CloseHandle(hEndRead);
    
            return 0;
          }
        }
        // ждем, пока завершится асинхронная операция чтения
        WaitForSingleObject(hEndRead, INFINITE);
        // печатаем число
        cout << n << ' ';
        // увеличивает смещение в файле
        ovl.Offset += sizeof(n);
      }
    }
    пример из буки одной, ненужное сам уберёшь, просто тут всё с комментами, тебе понятней чтобы
     
    #2 BastardFromHell, 22 Feb 2010
    Last edited: 22 Feb 2010
    3 people like this.
  3. Fl0dER

    Fl0dER New Member

    Joined:
    22 Dec 2008
    Messages:
    81
    Likes Received:
    3
    Reputations:
    0
    а как прочитать символьный текст ?
     
  4. Fl0dER

    Fl0dER New Member

    Joined:
    22 Dec 2008
    Messages:
    81
    Likes Received:
    3
    Reputations:
    0
    проверил код выводит 875770417 , хотя в файле 1234567
     
  5. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    а при чем тут символьный текст....

    ... когда в мессадж бокс вторым параметром ты должен передавать адреса буфера
    где лежат считанные данные!!!!

    ты же открыл Line ЛОКАЛЬНО..... при выходе из функции оана ПЕРЕСТАНЕТ СУЩЕСТВОВАТЬ!!!
    Code:
    
    char Line[256];
    
    LPCSTR ReadFromFile()
    {
        HANDLE FileHandle;
        DWORD R;
        DWORD Size;
    
        FileHandle = CreateFileA("C:\\file.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,F  ILE_ATTRIBUTE_NORMAL,NULL);
        Size = GetFileSize(FileHandle, &Size);
        if(Size>255) Size=255;
          ReadFile(FileHandle, Line, Size, &R, NULL);
       *(Line+R)=0;
        return Line;
    }
    
    
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    
    	MessageBox(0,ReadFromFile(),"",0);
    
    }
     
    #5 Delimiter, 22 Feb 2010
    Last edited: 22 Feb 2010
    1 person likes this.
  6. Fl0dER

    Fl0dER New Member

    Joined:
    22 Dec 2008
    Messages:
    81
    Likes Received:
    3
    Reputations:
    0
    Заюзал код , в мессейдж бокс выводит опять тоже самое что было в самом начале
     
    1 person likes this.
  7. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    скопируй .... и будет тебе счасте!
     
    1 person likes this.
  8. Fl0dER

    Fl0dER New Member

    Joined:
    22 Dec 2008
    Messages:
    81
    Likes Received:
    3
    Reputations:
    0
    говорю же юзаю твой код , невыводит нечего
     
  9. Fl0dER

    Fl0dER New Member

    Joined:
    22 Dec 2008
    Messages:
    81
    Likes Received:
    3
    Reputations:
    0
    Delimiter big thanks разобрался
     
  10. Fl0dER

    Fl0dER New Member

    Joined:
    22 Dec 2008
    Messages:
    81
    Likes Received:
    3
    Reputations:
    0
    вот так пральней


    LPCSTR ReadFromFile(LPVOID Buff)
    {
    HANDLE FileHandle;
    DWORD R;
    DWORD Size;

    FileHandle = CreateFileA("C:\\sys.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    Size = GetFileSize(FileHandle, &Size);
    if(Size>255) Size=255;
    ReadFile(FileHandle, Buff, Size, &R, NULL);
    *(Line+R)=0;
    CloseHandle(FileHandle);
    return 0;
    }



    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    char Line[256];
    ReadFromFile(Line);
    MessageBox(0,Line,"",0);

    }
     
  11. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    выражовывайся точнее....

    не "вот так правильнее" а....

    ВОТ ЕЩЕ ОДИН ВАРИАНТ! 8)))
     
  12. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Со стековой памятью нада аккуратней обращатся.
     
  13. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,284
    Reputations:
    327
    char Line[256]; замени на static char Line[256];
    тогда она будет в глобальной памяти, а то что у тебя - она стековая а стек вычищается.