Прикольное поведение feof () под Windows - PullRequest
0 голосов
/ 25 апреля 2019

Итак, я пишу программу, которая сканирует файлы, которые прекрасно работают при компиляции с gcc и clang в Linux. Но в Windows, с компилятором Microsoft и MinGW, ложные срабатывания feof (). Цикл должен прерваться, как только он обнаружит инструкцию завершения типа файла, feof только там как отказоустойчивый и никогда не запускает правильные файлы в Linux…

У меня была программа, печатающая расположение указателя файла с помощью ftell (), и значения просто неверны. EOF всегда срабатывает при значениях 2 ^ n, которые на несколько порядков меньше, чем фактический размер файла ...

while(1)
    {
            ...
            //File is read here
            //normally breaks before EOF-check

            if(feof(in))
            {
                    DEBUG_PRINTF("Reached EOF before IEND\n");
                    break;
            }
    }

EDIT:

открытие файла с "rb" вместо "r" решило проблему

1 Ответ

1 голос
/ 25 апреля 2019

Вы открыли свой файл с fopen(..., "r"). Это текстовый файл. ftell() вернет правильные значения для передачи обратно в fseek(), которые не совпадают со значениями числа прочитанных байтов, поскольку библиотека обрабатывает \r\n -> \n для вас.

Кроме того, вы либо открыли файл> = 4 ГБ (msvcrt.dll не может обрабатывать файлы такого большого размера), либо в файле есть байт 0x1A.

Обратите внимание, что связывание с msvcrt.dll является значением по умолчанию при использовании gcc в Windows и примерно эквивалентно времени выполнения Visual Studio 6. Вы, вероятно, не хотите ссылаться на это. Это действительно глючит. Увы этот вопрос о том, как этого не делать остается без ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...