如何使用 feof 从二进制文件中读取未定义数量的浮点值?
How to use feof to read an undefined number of float values from a binary file?
我将一些浮点值写入二进制文件,之后我想用另一个 .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,这意味着 reader 从未找到任何值。
我该怎么做?我在这里错过了什么?
在您的第二个程序中,FILE *fh = fopen ("file.bin", "wb");
打开文件进行写入并将其截断为零长度,从而破坏其中的数据。将其更改为 FILE *fh = fopen ("file.bin", "rb");
并删除后面的 fh = fopen ("file.bin", "rb");
.
此外,不要使用feof
来测试文件中是否有更多数据。 feof
仅在 上一个 读取或写入操作发生 EOF 或错误时报告。如果没有尝试读取过去,它不会告诉您文件位置指示器当前指向文件末尾。相反,检查 fread
的 return 值以查看它读取了多少项。
如果你使用size_t result = fread(&x, 1, sizeof (x), fh);
,你要求fread
读取sizeof (x)
个字节,它将return读取的字节数。如果小于 sizeof (x)
,则未读取完整的 x
。相反,如果您使用 size_t result = fread(&x, sizeof x, 1, fh);
,您要求 fread
读取 1 个大小为 sizeof x
的对象。那么fread
会return读取完整对象的个数,会是0或者1。
我将一些浮点值写入二进制文件,之后我想用另一个 .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,这意味着 reader 从未找到任何值。
我该怎么做?我在这里错过了什么?
在您的第二个程序中,FILE *fh = fopen ("file.bin", "wb");
打开文件进行写入并将其截断为零长度,从而破坏其中的数据。将其更改为 FILE *fh = fopen ("file.bin", "rb");
并删除后面的 fh = fopen ("file.bin", "rb");
.
此外,不要使用feof
来测试文件中是否有更多数据。 feof
仅在 上一个 读取或写入操作发生 EOF 或错误时报告。如果没有尝试读取过去,它不会告诉您文件位置指示器当前指向文件末尾。相反,检查 fread
的 return 值以查看它读取了多少项。
如果你使用size_t result = fread(&x, 1, sizeof (x), fh);
,你要求fread
读取sizeof (x)
个字节,它将return读取的字节数。如果小于 sizeof (x)
,则未读取完整的 x
。相反,如果您使用 size_t result = fread(&x, sizeof x, 1, fh);
,您要求 fread
读取 1 个大小为 sizeof x
的对象。那么fread
会return读取完整对象的个数,会是0或者1。