2016-12-26 12 views
3

Я использовал fwrite для хранения некоторых данных, и теперь я пытаюсь использовать fread для чтения данных из файла txt для обработки. Я хочу читать значения отдельно, но я не могу понять, как вы это сделаете. Это то, что я пробовал:Как я могу использовать 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, я не получаю seg-ошибку, но ничего не распечатывается. Любая идея, что я могу сделать, чтобы исправить это?

+0

ли некоторые ошибки проверки здесь: 'Pfile = fopen ("myfile.txt", "rb"); ' –

+0

@ πάνταῥεῖ Что wo uld Я проверяю? Это просто открывает файл. До тех пор, пока я получу правильное имя файла, он должен работать нормально. –

+0

Вы никогда не проверяли возвращаемое значение на 'NULL'! –

ответ

1

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

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

После

lSize = ftell (pFile); 

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

buffer = malloc(lSize); 

См. Do I cast the result of 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);   
} 
+0

Но значения, которые записываются в файл, имеют тип unsigned short. Когда я делаю то, что вы сказали, я просто получаю кучу «1z», распечатанную на экране. –

+0

Возвращаемое значение 'fread' - это количество прочитанных объектов. Если вы читаете по одному объекту за раз, значение 'result' будет' 1'. Вы видите '1z' как результат из-за ошибки в формате, который я предложил. Это нужно было ''% zu'' вместо ''% uz''. Я исправил ошибку в ответе. –

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

  • Нет связанных вопросов^_^