如何使用 fread 按值读取文件?
How can I use fread to read in a file value by value?
我使用fwrite
来存储一些数据,现在我正在尝试使用fread
从txt文件中读取数据进行处理。我想单独阅读这些值,但我不知道你会怎么做。这是我试过的:
#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
的个数。因此,你需要
buffer = malloc(lSize);
参见Do I cast the result of malloc?。如果您使用的是 C++ 编译器(正如您的 C++
标记所暗示的那样),则需要转换 malloc
.
的 return 值
格式说明符错误
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);
}
我使用fwrite
来存储一些数据,现在我正在尝试使用fread
从txt文件中读取数据进行处理。我想单独阅读这些值,但我不知道你会怎么做。这是我试过的:
#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
的个数。因此,你需要
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);
}