Consider these two files:
file1.txt (Windows newline)
abc\r\n def\r\n
file2.txt (Unix newline)
abc\n def\n
I noticed that for file2.txt, the position obtained with fgetpos is not increasing correctly. I am working on windows.
Let me show you an example. The following code:
#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; }
gives the following result:
file1: a (97) b (98) b (98) c (99) file2: a (97) b (98) (-1) (-1)
file1.txt works as expected, while file2.txt behaves strangely. To explain what was wrong with him, I tried the following code:
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; }
I got this conclusion:
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
I know that fpos_t not intended to be interpreted by the encoder, as it is implementation dependent. However, the above example explains the problems with fgetpos / fsetpos .
How is it possible that a newline sequence affects the internal position of a file, even before it encounters these characters?