Как я могу использовать fread для чтения значения файла по значению?

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

#include <stdio.h>
#include <stdlib.h>

int main ()
{
FILE * pFile;
long lSize;
unsigned short * buffer;
size_t result;

pFile = fopen ( "myfile.txt" , "rb" );

// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

// allocate memory to contain the whole file:
buffer = (unsigned short *) malloc (sizeof(unsigned short)*lSize);

// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);

printf("%uz\n", result);

// terminate
fclose (pFile);
free (buffer);
return 0;
}

Вышеуказанная программа компилируется нормально, но когда я запускаю ее с ./a.out Я получаю ошибку сегментации. Когда я запускаю его с sudo ./a.out Я не ошибаюсь, но ничего не печатается.
Любая идея, что я могу сделать, чтобы это исправить?

3

Решение

Проблемы, которые я вижу:

Выделение большего объема памяти, чем необходимо

После

lSize = ftell (pFile);

lSize устанавливается количество символов в файле, а не количество unsigned shorts. Следовательно, вам нужно

buffer = malloc(lSize);

Увидеть Я использую результат malloc?. Если вы используете компилятор C ++ (как ваш C++ Кажется, тег подразумевает), вам нужно привести приведенное значение malloc,

Неправильный спецификатор формата

printf("%s\n", result);

использует неверный спецификатор формата для печати result, Вам нужно использовать

printf("%zu\n", result);

Эта линия является наиболее вероятным виновником ошибки сегментации, которую вы видите.


Чтение объектов один за другим

Вы, конечно, можете использовать:

size_t count = lSize/sizeof(short);
for ( size_t i = 0; i < count; ++i )
{
unsigned short number;
result = fread (&number, sizeof(unsigned short), 1, pFile);
}

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

size_t count = lSize/sizeof(short);
for ( size_t i = 0; i < count; ++i )
{
result = fread (buffer+i, sizeof(unsigned short), 1, pFile);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector