C: fprintf 不工作

标签 c file printf

我有很长的 C 代码。一开始我打开两个文件并在上面写了一些东西:

  ffitness_data = fopen("fitness_data.txt","w");
  if( ffitness_data == NULL){
    printf("Impossible to open the fitness data file\n");
    exit(1);
  }else{
    fprintf(ffitness_data,"#This file contains all the data that are function of fitness.\n");
    fprintf(ffitness_data,"#Columns: f,<p>(f),<l>(f).\n\n");
  }
  fmeme_data = fopen("meme_data.txt","w");
  if( fmeme_data == NULL){
    printf("Impossible to open the meme data file\n");
    exit(1);
  }else{
    fprintf(fmeme_data,"#This file contains all the data relative to memes.\n");
    fprintf(fmeme_data,"#Columns: fitness, popularity, lifetime.\n\n");
  }  

这一步一切正常:文件已打开,上面写了两行。

然后我对随机过程进行了长时间的模拟,其代码对于问题的目的而言并不有趣:从未使用过文件及其指针。在流程结束时,我有:

for(i=0;i<data;i++){ 
 fprintf(fmeme_data,"%f\t%d\t%f\n",meme[i].fitness,meme[i].popularity,meme[i].lifetime);
}
for(i=0;i<40;i++){
 fprintf(ffitness_data,"%f\t%f\t%f\n",(1.0/40)*(i+0.5),popularity_histo[i],lifetime_histo[i]);
}

然后我对这两个文件执行 fflush()fclose()

如果我让代码在笔记本电脑上运行,两个文件都会被填满。如果代码在远程服务器上运行,则文件 fitness_data.txt 仅包含第一个打印件,即以 # 开头但不包含数据的打印件。我希望您注意:

  • 另一个文件从来没有给我带来问题。
  • 我已经习惯了这个服务器。类似的事情从未发生过。

鉴于所有这些信息,问题是:

为什么总是以相同的方式和相同的代码使用某个命令,总是在一个服务器上工作,而在不同的服务器上它有时工作但有时不工作?

管理员:我不认为这个问题是重复的。所有类似的问题都通过调整代码 ( here ) 或添加 fflush() ( here ) 和类似的东西来解决。这不是代码中的问题(在我看来),因为在我的笔记本电脑上它可以工作。我敢打赌它对大多数人都有效。

最佳答案

我们无法确定这里发生了什么,因为我们没有您的完整程序,也无法访问发生问题的服务器。但是,我们可以为您提供一些调试建议。

  • 当 C 程序在一台计算机上的行为不同于另一台计算机时,您首先应该怀疑是内存损坏。查找内存损坏的最佳可用工具是 valgrind .修复它报告的第一个 无效操作并重复直到它不再报告无效操作。问题很有可能会消失。

  • 尽可能提高警告级别并解决所有投诉,即使是那些看起来很愚蠢的投诉。

  • 您说您正在调用 fflushfclose,但您是否正在检查它们是否失败?彻底检查,像这样:

    if (ferror(ffitness_data) || fflush(ffitness_data) || fclose(ffitness_data)) {
        perror("write error on fitness_data.txt");
        exit(1);
    }
    
  • 如果您更改正在编译的优化级别,问题是否会消失?如果是这样,您可能有一个导致“未定义行为”的错误。不幸的是,很多方法可以做到这一点,我无法简单地解释如何寻找它们。

  • 使用类似 C-Reduce 的工具将您的程序缩减为更小的程序,该程序仍然无法正常工作,但足够短,可以完整地张贴在这里。

  • 阅读并按照文章“How to Debug Small Programs”中的说明进行操作。

关于C: fprintf 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49634309/

相关文章:

c - 在c中跳过文件中的行

java - 如何用java保存我的屏幕截图

bash - 快速转义任何字符串

C printf 打印随机数

c - 一个动画处理图标,纯C

c - 透明 float GtkEntry

c - 如何在 C 中将 char 指针与 + 运算符连接起来?

c++ - memmove 的性能是 memcpy 的两倍?

使用超过 1 个缓冲区复制二进制文件会导致错误的 md5 校验和

javascript - 将文件内容传递给函数,而不是下载文件