День добрый , вобщем появилась такая проблема , пытаюсь писать на чистом 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 чтобы прочитать текстовой файл
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); } } пример из буки одной, ненужное сам уберёшь, просто тут всё с комментами, тебе понятней чтобы
а при чем тут символьный текст.... ... когда в мессадж бокс вторым параметром ты должен передавать адреса буфера где лежат считанные данные!!!! ты же открыл 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); }
вот так пральней 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); }
char Line[256]; замени на static char Line[256]; тогда она будет в глобальной памяти, а то что у тебя - она стековая а стек вычищается.