问题描述
|
据我所知,在下面的代码中,文件已正确写入。当我查看文件floats.dat时,我看到此二进制流ѭ0stream
但是我的程序总是最终触发以下if语句:
if(fread(inputFloats,sizeof(float),LENGTH,binaryFile) < LENGTH)
{
fprintf(stderr,\"Problem reading some or all data from %s\\n\\n\",binaryFileName);
return EXIT_FAILURE;
}
有人在这里看到我做错了什么吗?完整代码如下。
#include <stdlib.h>
#include <stdio.h>
#define LENGTH 10
int main(void)
{
FILE *binaryFile,*textFile;
char *binaryFileName = \"floats.dat\",*textFileName = \"floats.txt\";
float floats[LENGTH] = {3.2,3.55,6.9,12.4,14.332,56.5,4003.4,456.4,65.7,83.4};
float inputFloats[LENGTH];
int i;
if((binaryFile = fopen(binaryFileName,\"r+\")) == NULL)
{
fprintf(stderr,\"Problem opening %s\",binaryFileName);
}
if(fwrite(floats,binaryFile) < LENGTH)
{
fprintf(stderr,\"Problem writing some or all data to %s\\n\",binaryFileName);
return EXIT_FAILURE;
}
printf(\"DATA WRITTEN SUCCESSFULLY\\n\");
if(fread(inputFloats,binaryFileName);
return EXIT_FAILURE;
}
for(i = 0; i < LENGTH; i++)
{
printf(\"float[%d] = %f\\n\",i,floats[i]);
}
return EXIT_SUCCESS;
}
解决方法
您不使用文本数据,因此在打开文件时应指定二进制模式。使用
r+b
代替r+
写入后,需要“ 5”来“倒回”文件。 rewind
也可用于这种情况-fseek
可让您将读取/写入指针放置在所需的任何位置。
,FILE
结构记录了文件当前指向的位置。由于您刚刚写入binaryFile
,因此文件指针位于所写入内容的末尾。
因此,在阅读之前,您需要使用fseek(binaryFile,SEEK_SET);
倒带文件。
,您在读文件之前忘了倒带文件:
rewind(binaryFile);
,当您完成对文件的写入时,FILE指针位于文件的末尾,因此,如果您尝试读取它,则当然是行不通的。在读取之前,尝试使用fseek
将指针移至文件的开头。
请避免这种情况:
if((binaryFile = fopen(binaryFileName,\"r+\")) == NULL) {
并喜欢这样:
binaryFile = fopen(binaryFileName,\"rb+\");
if(!binaryFile) {