使用的库
#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);
}
我修复了打印以获得更具可读性的外观,并添加了错误检查(即使不完全正确的比较浮点数)。