用C语言写入文件时缺少字符

标签 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;
}

并且在函数mc中调用了函数result_block。

通常,我希望文件如下所示:

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

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

什么可能导致此问题?

最佳答案

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

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

关于用C语言写入文件时缺少字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30553606/

相关文章:

C - 使用 strtok 只给我每行的第一个单词?

java - 如何在javafx中捕获IOException

PHP - 读取和写入相同的文件挂起

java.lang.ArrayIndexOutOfBoundsException?

python - 将列表变量写入文件

c - 如何在 Windows 中退出阻塞的 recv()?

c - 将 setvbuf() 与 STDIN 流一起使用

c - 是否可以在 Mac 上编译可在 Windows 上编译的 c 程序?

c - 为什么 size 命令没有列出任何可执行文件或目标文件的堆栈或堆段?

java - 程序在写入 .txt 文件时出现延迟?