在C中写入文件时缺少字符

时间:2015-05-31 03:42:31

标签: c file-writing

我一直在搜索,我实际上不确定如何寻找答案,因为它非常具体。

我有一个检查文件是否存在的函数,如果没有,则创建它并在其中写入一些参数。之后,另一个函数在文件中添加一些数据。但是第一行数据缺少使用该文件创建的行中的字符数。

代码看起来像这样(我只是把我认为相关的部分放在一起,因为它非常混乱):

检查文件是否存在的函数是:

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
...

第一行数据被文件第一行中相同数量的字符剪切。

什么可能导致这个问题?

1 个答案:

答案 0 :(得分:3)

close(fdesc);需要fclose(fdesc);。使用FILE *时,您隐式在输出中使用缓冲区。您需要调用fclose以便刷新缓冲区。

通过调用close,您实际上正在将指针转换为int并关闭一些随机文件描述符(大概时间可能会失败)。您根本没有关闭FILE *