C использованием Fread для чтения неизвестного количества данных - PullRequest
4 голосов
/ 11 декабря 2011

У меня есть текстовый файл с именем test.txt

Внутри него будет число, оно может быть следующим:

1
2391
32131231
3123121412

Т.е. это может быть любой размер числа, от 1 до х цифр.

В файле будет только 1 вещь - это число. Я хочу немного кода, используя fread, который прочитает это количество байтов из файла и поместит его в переменную соответствующего размера.

Кто-нибудь может предложить лучший способ решения этой проблемы?

Ответы [ 4 ]

4 голосов
/ 11 декабря 2011

Вы можете просто использовать:

char buffer[4096];
size_t nbytes = fread(buffer, sizeof(char), sizeof(buffer), fp);

if (nbytes == 0)
    ...EOF or other error...
else
    ...process nbytes of data...

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

Непонятно, как вы хотите создать «переменную соответствующего размера». Вы можете использовать динамическое выделение памяти (malloc()), чтобы обеспечить правильный объем пространства, и затем вернуть этот выделенный указатель из функции. Не забудьте проверить наличие нулевого возврата (не хватает памяти) перед его использованием.

1 голос
/ 11 декабря 2011

Если вы хотите избежать перечитывания, fread - неправильная функция. Вы, вероятно, хотите fscanf со спецификатором преобразования в соответствии с %100[0123456789] ...

1 голос
/ 11 декабря 2011

Один из способов добиться этого - использовать fseek , чтобы переместить местоположение вашего файлового потока в конец файла:

fseek(file, SEEK_END, SEEK_SET);

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

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

0 голосов
/ 29 февраля 2012

В зависимости от того, насколько умным вам нужно быть при преобразовании чисел ... Если вам не нужно быть особенно умным и быстрым, вы можете прочитать его как символ типа getc. Итак, начните с переменной, инициализированной в 0. Считайте символ, умножьте переменную на 10 и добавьте новую цифру. Затем повторите до готовности. Получите по мере необходимости переменную большего размера или начните с самой большой переменной размера, а затем скопируйте ее в наименьший размер, который подходит после завершения.

...