Рассмотрим эти два файла:fgetpos() зависит от символа новой строки
file1.txt (Windows перевод строки)
abc\r\n
def\r\n
file2.txt (Unix символ новой строки)
abc\n
def\n
I» ve заметил, что для файла file2.txt позиция, полученная с fgetpos
, не увеличивается правильно. Я работаю над Windows.
Позвольте мне привести вам пример. Следующий код:
#include<cstdio>
void read(FILE *file)
{
int c = fgetc(file);
printf("%c (%d)\n", (char)c, c);
fpos_t pos;
fgetpos(file, &pos); // save the position
c = fgetc(file);
printf("%c (%d)\n", (char)c, c);
fsetpos(file, &pos); // restore the position - should point to previous
c = fgetc(file); // character, which is not the case for file2.txt
printf("%c (%d)\n", (char)c, c);
c = fgetc(file);
printf("%c (%d)\n", (char)c, c);
}
int main()
{
FILE *file = fopen("file1.txt", "r");
printf("file1:\n");
read(file);
fclose(file);
file = fopen("file2.txt", "r");
printf("\n\nfile2:\n");
read(file);
fclose(file);
return 0;
}
дает такой результат:
file1:
a (97)
b (98)
b (98)
c (99)
file2:
a (97)
b (98)
(-1)
(-1)
file1.txt работает, как и ожидалось, в то время как file2.txt ведет себя странно. Чтобы объяснить, что случилось с ним, я попытался следующий код:
void read(FILE *file)
{
int c;
fpos_t pos;
while (1)
{
fgetpos(file, &pos);
printf("pos: %d ", (int)pos);
c = fgetc(file);
if (c == EOF) break;
printf("c: %c (%d)\n", (char)c, c);
}
}
int main()
{
FILE *file = fopen("file1.txt", "r");
printf("file1:\n");
read(file);
fclose(file);
file = fopen("file2.txt", "r");
printf("\n\nfile2:\n");
read(file);
fclose(file);
return 0;
}
Я получил этот результат:
file1:
pos: 0 c: a (97)
pos: 1 c: b (98)
pos: 2 c: c (99)
pos: 3 c:
(10)
pos: 5 c: d (100)
pos: 6 c: e (101)
pos: 7 c: f (102)
pos: 8 c:
(10)
pos: 10
file2:
pos: 0 c: a (97) // something is going wrong here...
pos: -1 c: b (98)
pos: 0 c: c (99)
pos: 1 c:
(10)
pos: 3 c: d (100)
pos: 4 c: e (101)
pos: 5 c: f (102)
pos: 6 c:
(10)
pos: 8
Я знаю, что fpos_t
не предназначена для интерпретации кодера, потому что это зависит от реализация. Однако приведенный выше пример объясняет проблемы с fgetpos
/fsetpos
.
Как возможно, что последовательность новой строки влияет на внутреннюю позицию файла, даже до того, как она встретит эти символы?
Btw изменение «rt» на «rb» устраняет проблему, но это не решение для меня, потому что я должен прочитать некоторые числа и строки из файла, используя fscanf. – miloszmaki
Я пробовал оба IDE: VS C++ 2010 и Dev-cpp. – miloszmaki
Можете ли вы добавить еще одну строку текста в свои два файла. Я подозреваю, что он «исправит себя» в том смысле, что '\ r' не засчитывается как символ, но когда вы перейдете ко второй строке, позиция переместит один символ. Другими словами, '\ r \ n' учитывается как единое целое, которое« 1 символ большой ». Ваш второй пар не имеет смысла. Вы даже не достигли новой строки, и все же вы говорите, что все пошло не так - я подозреваю, что вы хотели показать что-то еще? –