я использовал 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
Я не ошибаюсь, но ничего не печатается.
Любая идея, что я могу сделать, чтобы это исправить?
Проблемы, которые я вижу:
Выделение большего объема памяти, чем необходимо
После
lSize = ftell (pFile);
lSize
устанавливается количество символов в файле, а не количество unsigned short
s. Следовательно, вам нужно
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);
}
Других решений пока нет …