c - 如何使用 feof 从二进制文件中读取未定义数量的浮点值?
问题描述
我将一些浮点值写入二进制文件,然后我想用另一个.c
程序读回它们。
这就是我写它们的方式:
#include <stdio.h>
int main() {
/* Create the file */
float x = 1.1;
FILE *fh = fopen ("file.bin", "wb");
if (fh != NULL) {
for (int i = 0; i < 10; ++i)
{
x = 1.1*i;
fwrite (&x,1, sizeof (x), fh);
printf("%f\n", x);
}
fclose (fh);
}
return 0;
}
这就是我想阅读它们的方式:
#include <stdio.h>
int main(){
/* Read the file back in */
FILE *fh = fopen ("file.bin", "wb");
float x = 7.7;
fh = fopen ("file.bin", "rb");
if (fh != NULL) {
while(!feof(fh)){
if(feof(fh))
break;
fread (&x, 1, sizeof (x), fh);
printf ("Value is: %f\n", x);
}
fclose (fh);
}
return 0;
}
但我得到了 7.7,这意味着读者从未找到任何值。
我怎样才能做到这一点?我在这里错过了什么?
解决方案
在您的第二个程序中,FILE *fh = fopen ("file.bin", "wb");
打开要写入的文件并将其截断为零长度,从而破坏其中的数据。将其更改为FILE *fh = fopen ("file.bin", "rb");
并删除后者fh = fopen ("file.bin", "rb");
。
此外,不要feof
用于测试文件中是否有更多数据。仅在先前的读取或写入操作中feof
发生 EOF 或错误时报告。如果没有尝试读取过去,它不会告诉您文件位置指示器当前指向文件末尾。相反,请检查 的返回值以查看它读取了多少项。fread
如果使用size_t result = fread(&x, 1, sizeof (x), fh);
,则要求fread
读取sizeof (x)
字节,它将返回读取的字节数。如果小于sizeof (x)
,则x
未读取完整内容。相反,如果您使用size_t result = fread(&x, sizeof x, 1, fh);
,则要求fread
读取 1 个大小为 的对象sizeof x
。然后fread
将返回读取的完整对象的数量,这将是 0 或 1。
推荐阅读
- sql - 数组中的不同值
- python - 如何从 matplotlib 中具有多个分类列的数据框制作线图
- python - 使用 openpyxl 保存已编辑的 .xslx 工作表
- tensorflow - 可以用不可观察的外生状态定义 tf-agents 环境吗?
- java - 字符串比较导致不正确的结果
- c# - 无法等待转换的方法调用 - 语法错误
- java - 从数据库表读取到@Entity 模型会产生“未找到序列化程序”错误
- php - 我在 PHP 中有一个问题来检查标题
- google-cloud-platform - 在谷歌云平台(GCP)上连接 Erlang/Elixir VM 节点的问题,相同的 VPC - 不同的区域,MNESIA 无法复制
- python - 如何使用 pandas itertuples 比较两个数据帧之间的行?