我一直在搜索,我实际上不确定如何寻找答案,因为它非常具体。
我有一个检查文件是否存在的函数,如果没有,则创建它并在其中写入一些参数。之后,另一个函数在文件中添加一些数据。但是第一行数据缺少使用该文件创建的行中的字符数。
代码看起来像这样(我只是把我认为相关的部分放在一起,因为它非常混乱):
检查文件是否存在的函数是:
int check_datafile(char *fname, Par *par){
char filename[64] = "data/";
strcat(filename, fname);
FILE* fdesc = NULL;
fdesc = fopen(filename, "r");
if (fdesc == NULL){
fdesc = fopen(filename, "w");
fprintf(fdesc,"%d %.3f \n", par -> L, par -> t);
close(fdesc);
}
return 1;
}
然后写的函数是:
void result_block(Par *par, double M, double M2, double M4, int ntot, char *fname)
{
char filename[64] = "data/";
strcat(filename, fname);
FILE* fichier = NULL;
fichier = fopen(filename, "a");
if (fichier != NULL) // File should already exist
{
fprintf(fichier, "%.3f %.3f %.3f\n", M/ntot, M2/ntot, M4/ntot);
fclose(fichier);
}
else
{
printf("Problem with the file : %s\n", filename);
exit(0);
}
}
他们被
调用int initialize_mc(Par *par, int *spin) {
int i, L2 = par->L * par->L;
double T = par -> t;
char *f2;
double ex[1];
ex[0] = exp(-2/T);
if (!par->L) {
printf("Give system size N!\n");
return 0;
}
init_ran(par->seed);
sprintf(fname, "%3.3d_%5.3f", par->L, par->t);
check_datafile(fname, par);
mc(par, spin, ex);
return 1;
}
函数result_block在函数mc中被调用。
通常,我希望文件看起来像这样:
16 2.210
205.412 43371.160 2010463301.344
201.876 42319.600 1951381846.720
198.396 40897.632 1836904396.032
197.652 40743.856 1833699088.000
...
它看起来像这样:
16 2.210
371.160 2010463301.344
201.876 42319.600 1951381846.720
198.396 40897.632 1836904396.032
197.652 40743.856 1833699088.000
...
第一行数据被文件第一行中相同数量的字符剪切。
什么可能导致这个问题?
答案 0 :(得分:3)
close(fdesc);
需要fclose(fdesc);
。使用FILE *
时,您隐式在输出中使用缓冲区。您需要调用fclose
以便刷新缓冲区。
通过调用close
,您实际上正在将指针转换为int并关闭一些随机文件描述符(大概时间可能会失败)。您根本没有关闭FILE *
。