чтение из текстового файла: странные последовательности "\ x01 \ 0 \ 0 \ 0" - PullRequest
0 голосов
/ 04 марта 2012

Я боролся с этой проблемой в течение одной недели и все еще далек от решения.

Я читаю простой текст из файла строками.Он читает все успешно, пока персонаж с определенным большим числом.Это число индивидуально для каждого файла и различно для разных файлов.

После достижения символа с таким большим числом он читает последовательности "\ x01 \ 0 \ 0 \ 0" (состоящие из 4 символов) дляодин или несколько раз вместо исходных символов, а затем все правильно читает (до следующего большого числа).

В двух словах - вместо чтения этого:

... many characters ...
First read failure!
... many characters ...
Second read failure, second read failure!
... many characters ...
etc.

itчитает это:

... many characters ...
First read f\x01\0\0\0re
... many characters ...
Second read failu\x01\0\0\0\x01\0\0\0\x01\0\0\0ead failure!
... many characters ...
etc.

У вас есть какие-либо идеи о причине этой проблемы?

Дополнительная информация:

 1) The "ferror" condition is not true.
 2) I am reading from file using streams (fopen, fread, fclose)
 3) Have tested different read methods: "fread cycle" and "fgets".
    The results are the same.
 4) The binary optimization is disabled in the compiler's settings.
    It seams that the problem is not connected with a compiler.
    Neither GCC, nor Apple LLVM gives me the desired result.
 5) Attempting to solve the issue, I converted the whole project from C++ to C,
    but the problem doesn't disappear.

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Как я и предлагал в комментариях:

  • вы должны поставить свой исходный код в вопросе (который вы всегда можете отредактировать для улучшения), а не в комментариях
  • вы должны использоватьPOSIX 2008 getline на вашем FILE*.
  • вы должны free буфер неявно malloc -ed на getline позже, например, когда fclose -ing ваш FILE* handle.
  • вы должны научиться использовать отладчик типа gdb
  • , вы должны научиться использовать детектор утечки памяти, как valgrind
1 голос
/ 04 марта 2012

fread() не обязательно NUL завершать ввод.Вам нужно проверить возвращаемое значение и завершить строку самостоятельно, если вы хотите обработать ввод как строку

chk = fread(input, <WHATEVER>);
if (chk > 0) {
    input[chk] = 0; /* terminate input */
    /* WHATEVER */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...