我想知道我是否可以使用fread将数据读入整数缓冲区。 我看到fread()将void *作为第一个参数。所以我不能只传递一个整数 缓冲区(类型转换为void *)然后使用它来读取我想要的文件中的howmuchevery字节,只要缓冲区足够大?
即。我无法做到:
int buffer[10];
fread((void *)buffer, sizeof(int), 10, somefile);
// print contents of buffer
for(int i = 0; i < 10; i++)
cout << buffer[i] << endl;
这里有什么问题?
由于
答案 0 :(得分:7)
如果您使用类似fwrite
(“二进制”写入)的内容将文件写入文件,这应该可行。如果文件是人类可读的(您可以使用文本编辑器打开它并查看有意义的数字),您可能需要fscanf
/ cin
。
答案 1 :(得分:4)
正如其他人所说,fread应该能够做你想做的事 如果输入是您期望的二进制格式。一个警告 我想补充的是代码将具有平台依赖性和 如果在两者之间移动输入文件,它将无法正常工作 具有不同大小或不同大小的平台 endian-nesses(sp)。
此外,您应该始终检查您的返回值;恐惧可能会失败。
答案 2 :(得分:2)
是的,您可以使用fread读取整数数组
int buffer[10];
size_t readElements = fread((void *)buffer, sizeof(int), 10, somefile);
for(int i = 0; i < readElements; i++)
cout << buffer[i] << endl
你可以检查fread返回要打印的元素数量。
编辑:如果您正在以二进制模式读取文件,并且这些值被写为带有fwrite的cnicutar。
答案 3 :(得分:2)
我正在尝试相同的结果并获得与您相同的结果,当尝试使用文件中的fread()
读取整数时获得大的int值,并最终得到了它的原因。
因此,假设您的输入文件仅包含:
5
”5 5 5
”我从http://www.programmersheaven.com/mb/beginnercpp/396198/396198/fread-returns-invalid-integer/
获得的详细信息 fread()
读取二进制数据(即使文件以'text'模式打开)。十六进制中的540352565
为0x20352035
,0x20
为空格的ASCII代码,0x35
为'5'
的ASCII代码(它们位于因为使用小端机器而反转顺序。
所以fread
所做的是从文件中读取ASCII代码并从中构建一个int,期望二进制数据。这应该解释在阅读'5 5 5'
文件时的行为。使用单个'5'
读取文件时会发生同样的情况,但只能读取一个字节(如果后面跟一个换行符,则只读取两个),如果读取小于{{1,则fread
会失败}},这是sizeof(int)
(在这种情况下)。
答案 4 :(得分:1)
由于对响应的反应是它仍然不起作用,我将在这里提供完整的代码,以便您可以尝试。
请注意,以下代码不包含正确的检查,如果文件不存在则CAN崩溃,则没有内存,没有权限等。 在代码中应该添加检查每个打开,关闭,读取,写入操作。
此外,我会动态分配缓冲区。
int* buffer = new int[10];
那是因为当普通数组被当作指针时我感觉不舒服。但是无所谓。还请注意,根据数字范围,应使用正确的类型(uint32_t,16,8,int,short ...)来节省空间。
以下代码将创建文件并写入正确的数据,然后您可以阅读。
FILE* somefile;
somefile = fopen("/root/Desktop/CAH/scripts/cryptor C++/OUT/TOCRYPT/wee", "wb");
int buffer[10];
for(int i = 0; i < 10; i++)
buffer[i] = 15;
fwrite((void *)buffer, sizeof(int), 10, somefile);
// print contents of buffer
for(int i = 0; i < 10; i++)
cout << buffer[i] << endl;
fclose(somefile);
somefile = fopen("/root/Desktop/CAH/scripts/cryptor C++/OUT/TOCRYPT/wee", "rb");
fread((void *)buffer, sizeof(int), 10, somefile);
// print contents of buffer
for(int i = 0; i < 10; i++)
cout << buffer[i] << endl;
fclose(somefile);