从文件中读取浮点数时 C 中的 fread() 问题



使用的库

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
创建

具有随机浮点数的数据集并在新创建的文件上打印

void createdataset(int Datasetsize,char * filename)
{
FILE *f;
int su;
float v[Datasetsize];    
srand((unsigned int)time(NULL));
for(int i = 1; i<=Datasetsize;i++) 
*(v+i)=((float)rand()/(float)(RAND_MAX)) * 100;
f=fopen(filename,"wb");
su=fwrite(v ,sizeof(float) , Datasetsize , f);
printf("%dn",su);
fclose(f);
}

使用 fread() 读取新创建的文件并显示成功尝试的次数。它总是给出不成功的尝试,例如从 1000 条记录中读取 120 条记录,其余的已损坏。我需要解决这个问题。

void loadDataset (int DataSetSize, char *filename, float *v) 
{
FILE *fp;
int s;
fp = fopen( filename , "r" );
if( fp==NULL) 
printf("File cant be opened");
s=fread(v , sizeof(float), DataSetSize, fp );
printf("%dn",s);
for( int i=0; i<DataSetSize; i++)
{
printf("t%f",*(v+i));
}
fclose(fp);
}

主要功能

void main()  
{ 
char ch;
FILE *fp;
int datasetsize;
char filein[50];
char *fi=filein, ds; 
printf("Enter the size of the datasetsize: ");
scanf("%d",&datasetsize);
float v[datasetsize];
printf("%dn",datasetsize);
printf("Enter input file name: ");
scanf("%s",filein);
printf("%sn",filein);
createdataset(datasetsize,fi);
loadDataset(datasetsize, fi, v);
}

包括conio.h,你在Windows下

行为

su=fwrite(v ,sizeof(float) , Datasetsize , f);
...
s=fread(v , sizeof(float), DataSetSize, fp );

写入和读取二进制文件,在Windows下写入和读取二进制文件,您需要使用"wb"和"rb",因此需要替换

f=fopen(filename,"w");
...
fp = fopen( filename , "r" );

f=fopen(filename,"wb");
...
fp = fopen( filename , "rb" );

,但另请参阅下面的备注

<小时 />

创建数据集中:

你不检查你是否能够打开文件,你需要检查FP是否为,例如使用perror来指示原因:

if (fp == NULL)
{
perror("cannot open file to write"); 
exit(-1);
}

还要做

*(v+i)=...

设置数组元素的可读性不是很好,只需

v[i] = ...

加载数据集中你不能做

if( fp==NULL) 
printf("File cant be opened");

并继续,就像没有错误一样,您需要停止执行return或将其余部分放在else分支中的函数,然后再次可以使用perror来指示问题:

if (fp == NULL)
{
perror("cannot open the file to read");
exit(-1);
}

还要做

printf("t%f",*(v+i));

访问数组元素的可读性不是很好,只需执行

printf("t%f", v[i]);

主要

scanf("%d",&datasetsize);

如果用户没有输入有效的int,则由于未设置数据集大小,则行为未定义,例如最好这样做:

if ((scanf("%d",&datasetsize) != 1) || (datasetsize < 1)) {
puts("invalid size);
return -1;
}

如果用户

输入超过 49 个字符,

char filein[50];
...
scanf("%s",filein);
具有未定义的行为,请执行

scanf("%49s",filein);

即使最好检查scanf返回 1,以防stdin在空输入文件中重定向

布鲁诺的回答指出了基本问题。 作为演示,我在此处发布工作代码,因为在注释中是不可能的:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
void createdataset(int Datasetsize, char *filename, float *v)
{
FILE *f;
int su;
f = fopen(filename, "wb");
if (!f)
{
printf("Error creating file. Program aborted...n");
abort();
}
printf("Writing %d entries to file "%s".n", Datasetsize, filename);
srand((unsigned int)time(NULL));
for (int i = 1; i <= Datasetsize; i++)
{
*(v + i) = ((float)rand() / (float)(RAND_MAX)) * 100;
printf("t%fn",*(v+i));
}
su = fwrite(v, sizeof(float), Datasetsize, f);
printf("Wrote %d floats to filen", su);
fclose(f);
}
void loadDataset(int DataSetSize, char *filename, float *v)
{
FILE *fp;
int s;
fp = fopen(filename, "rb");
if (fp == NULL)
{
printf("File cant be opened");
return;
}
s = fread(v, sizeof(float), DataSetSize, fp);
printf("Read data set composed of %d entries.n", s);
for (int i = 0; i < DataSetSize; i++)
{
printf("t%fn", *(v + i));
}
fclose(fp);
}
int main(int argc, char *argv[])
{
char ch;
FILE *fp;
int datasetsize;
char filein[50];
char *fi = filein, ds;
printf("Enter the size of the datasetsize: ");
scanf("%d", &datasetsize);
printf("%dn", datasetsize);
float v_out[datasetsize];
float v_in[datasetsize];
printf("Enter input file name: ");
scanf("%s", filein);
printf("%sn", filein);
createdataset(datasetsize, fi, v_out);
loadDataset(datasetsize, fi, v_in);
int errors=0;
for (int i=0; i<datasetsize; i++)
if (v_in[i] != v_out[i])
{
printf("Error in/out in position %d, v_in=%f, v_out=%fn", i, v_in[i], v_out[i]);
errors++;
}
printf("Completed with %d error(s).n", errors);
}

我修复了打印以获得更具可读性的外观,并添加了错误检查(即使不完全正确的比较浮点数)。

最新更新