2010-09-13 3 views
1

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

Если я использую следующий код, затем:

char dataStr[256]; 

fread(dataStr, strlen(dataStr), 1, dFd); 

fread возвращается 0 для указанного выше вызова и не читает любую вещь из файла.

Но, если я задаю размер как 1, тогда он успешно считывает один файл char из файла.

Какое должно быть значение аргумента size для функции fread(), если мы не знаем, насколько размер данных в файле?

ответ

1

Вы должны использовать:

fread(dataStr, 1, sizeof dataStr, dFd); 

, чтобы указать, что вы хотите прочитать число байт, равного размер вашего буфера массива.

Причина, почему ваш код не работает, что strlen() находит длину строки в NULL завершающим, а не размер буфера. В вашем случае вы запускаете его в неинициализированном буфере и просто получаете удачу, ваш первый байт в буфере равен NULL, поэтому strlen(dataStr) возвращает 0, но с такой же вероятностью может произойти сбой или вернуть некоторое случайное число, большее вашего размера буфера.

отметить также, что fread() возвращает количество элементов чтения, а не количество символов (я сменил вторые и третьи аргументы так, что каждый символ соответствует одному пункту).

3

strlen подсчитывает количество символов, пока оно не достигнет \ 0.
В этом случае вы, вероятно, попадаете \ 0 на самый первый символ, поэтому strlen возвращает 0 как длину и ничего не читается.

Вы должны использовать sizeof вместо strlen.

2

Вы не можете этого сделать, очевидно.

Вы можете прочитать до известного разделителя, часто линии подачи, используя fgets(), чтобы прочитать строку. Или вы можете прочитать количество байтов с известным в начале, используя этот аргумент.

Конечно, если есть верхняя граница объема данных, вы можете прочитать это всегда, а затем как-то проверить данные, чтобы узнать, что у вас есть.

Кроме того, в вашем примере вы используете strlen() аргумент, который будет перезаписан, что подразумевает, что он уже содержит правильную строку того же размера, что и данные, которые будут прочитаны. Это кажется маловероятным, вы, вероятно, имеете в виду sizeof dataStr.

-2

fread возвращает количество успешно прочитанных numblocks. Вы можете:

if(1==fread(dataStr, 256, 1, dFd)) 
    puts("OK"); 

Он читает всегда полную длину указанных Вами данные; fread не может сломаться на '\ 0'.

+0

Проблема, с которой я столкнулся, заключается в том, что я точно не знаю, какой размер данных в файле. (В основном файл будет содержать номер, поэтому он может быть 8 или 3445 или любой другой номер). Теперь, что происходит, он читает некоторый барахл после прочтения числа, когда я дал sizeof как аргумент размера. Как я могу прочитать точные данные (в этом случае число), не зная размеров из файла. – vikas

Смежные вопросы