如何使用fread按值读取文件值?

问题描述:

我用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

@πάνταῥεῖ什么窝我检查?这只是打开文件。只要我得到了正确的文件名,它应该可以正常工作。 –

+0

你从来没有根据'NULL'检查返回值! –

问题,我看到:

分配更多的内存比需要

lSize = ftell (pFile); 

lSize设置为字符的文件的数量,而不是unsigned short S上的号码后。因此,您需要

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“'。我在答案中解决了错误。 –