如何使用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错误,但没有打印出来。 任何想法我可以做什么来解决它?
问题,我看到:
分配更多的内存比需要
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);
}
但写入文件的值是unsigned short类型。当我按照你所说的去做时,我会在屏幕上打印出一堆'1z'。 –
'fread'的返回值是读取的对象数。如果您一次读取一个对象,'result'的值将为'1'。由于我建议的格式错误,您会看到'1z'作为输出。它需要是“%zu”而不是“”%uz“'。我在答案中解决了错误。 –
做一些错误检查这里:'PFILE = fopen(“myfile.txt”,“rb”);' –
@πάνταῥεῖ什么窝我检查?这只是打开文件。只要我得到了正确的文件名,它应该可以正常工作。 –
你从来没有根据'NULL'检查返回值! –