Программа, которая работает очень хорошо на моей системе freeBSD, терпит неудачу, когда я ее создаю на окнах (Visual Studio 15). Он переходит в бесконечный цикл здесь:Почему fgetc перемещает указатель позиции файла назад?
//...
while (1) {
if ('@' == fgetc(f)) {
// we do some stuff here. irrelevant for stackoverflow question
break;
}
fseek(f, -1, SEEK_CUR);
if (0 != fseek(f, -1, SEEK_CUR)) {
// Beginning of file.
break;
}
}
//...
На ближайшем рассмотрении (добавив кучу fgetpos() - звонки) Я считаю, что fgetc перемещает указатель положения файла назад. Таким образом, он пропускает начало файла и некоторые «@», если они не находятся в позиции с несколькими позициями с конца.
Я заметил, что это только тогда, когда сложилось, файл е открыт с
fopen(filename, "a+");
//text mode read/append
Когда я изменить его на
fopen(filename, "ab+");
//binary mode read/append
тогда все работает, как ожидалось. Я думаю, что для моего кода безопасно использовать бинарный режим все время. Осталось два вопроса:
- Есть ли причины, которые стоят против двоичного режима?
- Какая обманка с неправильным направлением в текстовом режиме?
Можете ли вы разместить [MCVE] (http://stackoverflow.com/help/mcve), пожалуйста? –
При открытии файла в текстовом режиме есть некоторые переводы символов, которые могут произойти, особенно в новой строке в Windows - '' \ r \ n "', и при чтении он переводится в обычный' '\ n''. В Unix-системах, таких как строки новой строки BSD, существует только один '' \ n ", поэтому в таких системах перевод не выполняется. Я не знаю, объясняет ли это ваш вопрос. –
«Есть ли причины, которые стоят против двоичного режима?» - На самом деле, есть много чего сказать в режиме * text * ... – DevSolar