Перекрывающийся синхронный вызов чтения для чтения 1000 байтов 88 -байтового файла не запускает error_handle_eofC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перекрывающийся синхронный вызов чтения для чтения 1000 байтов 88 -байтового файла не запускает error_handle_eof

Сообщение Anonymous »

Содержимое текстового файла с именем существующего file.txt выглядит следующим образом

Код: Выделить всё

The First Order Derivative of X2 is
2x. The derivative of sin is cos.
Math is the best
Код ниже взят из файла с именем main.cpp , который находится в том же каталоге, что и существующий file.txt
Пример показывает процесс
  • Открыть ручку для существующего файла. ESCEANINGFILE.TXT
  • Чтение 1000 байтов существующего file.txt
  • Вывод массива символов 1000 байтов до первого нулевого терминатора
#include
#include

int main(int, char**){
//Creating Synchronous File Handle
HANDLE hFile = CreateFileW(
L"existingfile.txt",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
printf("ERROR IN OPENING FILE %lu\n", GetLastError());
return -1;
}
//Obtaining File Size
{
ULARGE_INTEGER FileSize;
FileSize.LowPart = GetFileSize(hFile, &FileSize.HighPart);
DWORD LastError = GetLastError();
if (FileSize.LowPart == INVALID_FILE_SIZE && LastError != NO_ERROR){
printf("FAILED TO OBTAIN FILE SIZE, ERROR %lu\n", LastError);
return -1;
}
printf("FILE SIZE: %llu\n", FileSize.QuadPart);
}
//Reading To End Of the File
{
OVERLAPPED Overlapped = {};
Overlapped.Offset = 15;
Overlapped.OffsetHigh = 0;
constexpr DWORD NumBytesToRead = 1000;
char BytesRead[NumBytesToRead + 1] = {0};
BOOL Successful = ReadFile(hFile, BytesRead, NumBytesToRead, NULL, &Overlapped);
DWORD LastError = GetLastError();
if (!Successful){
if (LastError != ERROR_HANDLE_EOF){
printf("ERROR IN OVERLAPPED SYNCHRONOUS READ TO EOF, ERROR %lu\n", LastError);
return -1;
}
puts("EOF ENCOUNTERED IN OVERLAPPED SYNCHRONOUS READ TO EOF");
}
BytesRead[NumBytesToRead] = 0;
printf("2: Information Read: '%s'\n", BytesRead);
}
CloseHandle(hFile);
return 0;
}
< /code>
Вывод, который я получаю, является < /p>
FILE SIZE: 88
2: Information Read: ' Derivative of X2 is
2x. The derivative of sin is cos.
Math is the best'
< /code>
Вывод, который я ожидал, был < /p>
FILE SIZE: 88
EOF ENCOUNTERED IN OVERLAPPED SYNCHRONOUS READ TO EOF
2: Information Read: ' Derivative of X2 is
2x. The derivative of sin is cos.
Math is the best'
< /code>
Поскольку он указан в документации Readfile < /p>

Соображения для работы с синхронными ручками файла: < /p>
< /blockquote>

P>. /> Если lpoverlaped не является нулевым, то, когда операция синхронного чтения достигает конца файла, Readfile возвращает false и GetlasterRor возвращает error_handle_eof.


Подробнее здесь: https://stackoverflow.com/questions/795 ... ile-does-n
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»