Intereting Posts
Как оживить поворот, вызванный ключом в OpenGL и GLUT? Сравнение двух массивов в C, элемент за элементом Каково приблизительное разрешение числа с плавающей запятой с одной точкой, когда ее вокруг нуля Есть ли бит-эквивалент sizeof () в C? Почему компиляторы позволяют строковым литералам не быть const? Указатели указателей в C Преобразование функции перевода первого порядка в код c Применение алгоритма Backtracking для определения минимального количества семестров для выпускников Понимание предупреждения «сравнение продвинутого ~ без знака с неподписанным» Аргумент Linux Pthread «Использование знакового целочисленного операнда с двоичным побитовым оператором» – при использовании короткого замыкания без знака Как отсортировать стек, используя только Push, Pop, Top, IsEmpty, IsFull? Почему я получаю эту ошибку доступа к памяти «двойная свобода или коррупция»? mremap (2) с HugeTLB для изменения виртуального адреса? Определить функциональный макрос в C?

Почему ftell () показывает неправильную позицию после fread ()?

Я получаю очень странную ошибку при попытке прочитать из простого текстового файла с вызовом c fread ().
Я сделал очень простую программу, чтобы показать эту ошибку:

int main(int argc ,char ** argv) { FILE* fh = fopen("adult.txt","r"); if(fh==NULL){ printf("error opening file\n"); exit(0); } int s = 1000; printf("cur before=%d\n",ftell(fh)); char* b = malloc (sizeof(char)*s); int k =fread(b,sizeof(char),s,fh); printf("cur after reading %d bytes =%d\n",k,ftell(fh)); return EXIT_SUCCESS; } 

И что я получаю как вывод:

 cur before=0 cur after reading 1000 bytes =1007 

Это нормально? fread возвращает число «1000», но курсор (с ftell ()) показывает 1007, и любая помощь будет оценена.

Это нормально.

'\n' может быть представлен двумя символами, поэтому есть искажение, которое вы получаете.

Если вы не хотите, чтобы это произошло, откройте финал в двоичном режиме.

Из документации ftell :

или двоичных streamов, возвращаемое значение соответствует количеству байтов от начала файла. Для текстовых streamов значение не гарантируется как точное количество байтов от начала файла, но возвращаемое значение все еще можно использовать для восстановления индикатора положения в этой позиции с помощью fseek.

Так что да, это нормально.

Ответ Let_Me_Be правильный. Я просто объясняю здесь, что символ «Конец строки» (EOL) зависит от базовой операционной системы. Например, в Windows, если вы открываете файл с «r» (или не двоичным), тогда всякий раз, когда есть последовательность «\ r \ n», ОС вернет только «\ n». То же самое, когда вы пишете файл, который не открывается в двоичном режиме, а затем в Windows он будет писать ‘\ r \ n’, когда вы просто пишете ‘\ n’. Для Unix-систем такой перевод с ОС не производится. Классические Mac использовали ‘\ r’ для символа End of Line, но теперь я думаю, что они используют ‘\ n’ для EOL. Надеюсь, это очистит модное слово ‘\ n’, которое будет представлено (возможно) несколькими символами (\ r \ n).