Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > ReadFile |
Автор: YahоО 7.5.2021, 20:56 | ||
Создает файл в несколько строк, и пробует его прочитать, и сразу же напечатать в консоли. Файл создает хорошо. Файл читает. Но в консоли пишет всякую ересь, все невпопад печатает, и кроме того имеются повторы считанного и уже ранее напечатанного в консоли текста. При этом количество считанных байт совпадает с размером файла, и весь текст в общем то в напечатанном имеется, но результат все же неверный. Асинхронность, или жадный поиск, в смысле жадное чтение? или выборочное избирательное перечитывание уже прочтенного файла, не понятно как это вообще такое может быть. Можно ли так подправить код чтобы он сам свои же ошибки и показывал? а то ведь в данном коде чтение завершено типа успешно. И самый вопрос - ReadFile именно так и должен читать файл с диска? |
Автор: Aa1 8.5.2021, 04:23 | ||
Перед выводом в консоль добавьте
|
Автор: YahоО 8.5.2021, 12:18 |
Великолепно! Коротко, и лечит капитально, и все работает. Но не понятно!!! --1- lpBuffer он же Line, так ведь же: vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_readfile.htm "Доступ к буферу ввода, в то время как операция чтения использует этот буфер, может привести к искажению прочитанных данных в буфер. Приложения не должны читать из, записывать в, перераспределять или освобождать буфер ввода, который использует операция чтения до тех пор, пока она не завершится." ??? --2- BOOL ReadFile( HANDLE hFile, // дескриптор файла LPVOID lpBuffer, // буфер данных DWORD nNumberOfBytesToRead, // число байтов для чтения LPDWORD lpNumberOfBytesRead, // число прочитанных байтов LPOVERLAPPED lpOverlapped // асинхронный буфер ); Так есть же Size, отвечающий за финиш, и он же наверно и должен подсчитывать количество прочитанных символов, и заканчивать свое чтение файла в нужной точке, следовательно проблема по всей видимости в Size, и я подумал что нужно как то экспериментировать с размером Size, добавив DWORD Size0 = GetFileSize(hFile, &Size0); и по мере чтения файла уменьшать его на количество прочитанных символов, с тем чтобы читать только оставшееся количество символов, т.е. пока Size больше 0. Но это как то не сработало. --3- И формула есть, в смысле функция имеется, и что то в ней не ясно, не очевидно, не понятно, значит это магия, и соответственно Line[R]=0; тоже магия ![]() --4- Значит надо изучить еще и "Типы данных Windows". Aa1, спасибо! |
Автор: YahоО 8.5.2021, 14:41 |
Line[R]='\0'; // если так, то как бы понятнее )) Но! Почему умный компилятор и умный С++ этого не делают сами? Неужели им самим это невдомек? (ну их же аж двое!) --- Разве возможны варианты использования функции ReadFile в том виде как она сейчас есть, т.е. без доработок Line[R]=... типа догадайся сам, что после их работы нужно еще какие то коррективы вносить чтобы мусор отделить от плевел, и чтобы все цвело и пахло? ущербная магия требует доработки человеком? Доверяй, но проверяй! ))))) |