C-программирование ftell fseek fread, чтение размера файла - PullRequest
0 голосов
/ 04 декабря 2009

У меня есть файл. Я прочитал размер файла. Затем я читаю по два байта за раз, пока не доберусь до конца файла. После каждой операции чтения я увеличиваю текущую позицию на 2, однако позиция не увеличивается после того, как я получу половину размера файла, операция fread будет читать 0 байтов.

программа считывает размер файла. Я выполняю fread (2 байта каждый раз), пока текущая позиция не станет равной размеру файла. Он читает 22915 байтов для размера файла Он увеличивает позицию на 2 после каждого чтения, однако, когда текущая позиция достигает 11459, что составляет половину размера файла, он будет читать нулевые байты, таким образом, входя в бесконечный цикл.

FILE *file;
char *file_name;
int readCount = 0;
int position = 0;
int fileSize;
unsigned short mem_accesses;

file_name = "sample.txt";

/** open the file */
file = fopen(file_name, "rb");
fseek(file, 0, SEEK_END);
fileSize = ftell(file);
rewind(file);


while(position<fileSize){
   mem_accesses = getNumberAccesses();
   printf("position: %d filesize: %d\n",position, fileSize);

}

unsigned short getNumberAccesses(){
/** calculate number of accesses for process */
unsigned short val;

readCount = fread(&val, sizeof(val), 2, file);

position += readCount;
printf("read count: %d\n", readCount);

return val;
}

Ответы [ 2 ]

8 голосов
/ 04 декабря 2009
readCount = fread(&val, sizeof(val), 2, file);  

Это утверждение читает два элемента по два байта каждый. И он возвращает значение 2 для количества прочитанных элементов. Второй и третий параметры, умноженные вместе, сообщают fread, сколько байтов нужно прочитать.

1 голос
/ 04 декабря 2009

fread возвращает количество прочитанных элементов, а не количество байтов.

(Между прочим, в вашем коде вы ошибочно указали ему число элементов 2, которое вызывает переполнение буфера).

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

Вместо того чтобы запрашивать размер файла, я просто вызывал бы fread (или другие функции ввода) в цикле до конца файла.

...