簡體   English   中英

C:fprintf不起作用

[英]C: fprintf does not work

我有很長的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僅包含第一個打印,即,以#開頭的打印不包含數據。 我希望您注意:

  • 另一個文件永遠不會給我帶來問題。
  • 我已經習慣了這個服務器。 從未發生過類似的事情。

鑒於所有這些信息,問題是:

為什么總是以相同方式和相同代碼使用的某個命令始終在服務器上運行,而在另一台服務器上卻有時卻不能運行?

管理員:我不認為這個問題是重復的。 通過調整代碼( 在此處 )或添加fflush()在此處 )和類似的方法,解決了所有類似的問題。 這在代碼中沒有問題(以我的謙遜觀點),因為在我的筆記本電腦上它可以工作。 我敢打賭它對大多數人都有效。

我們無法確定發生了什么,因為我們沒有完整的程序,也無法訪問發生問題的服務器。 但是,我們可以為您提供一些調試建議。

  • 當C程序在一台計算機上的行為不同於另一台計算機時,您首先要懷疑的是內存損壞。 查找內存損壞的最佳可用工具是valgrind 修復它報告的第一個無效操作,並重復執行直到不再報告無效操作為止。 很有可能問題將消失。

  • 盡可能提高警告級別,並解決所有投訴,甚至是看起來很傻的投訴。

  • 您說您正在調用fflushfclose ,但是您是否正在檢查它們是否失敗 像這樣徹底檢查:

     if (ferror(ffitness_data) || fflush(ffitness_data) || fclose(ffitness_data)) { perror("write error on fitness_data.txt"); exit(1); } 
  • 如果您更改要使用的優化級別,問題是否會消失? 如果是這樣,您可能有一個導致“未定義行為”的錯誤。 不幸的是,有很多可能的方法可以做到這一點,我不能輕易解釋如何尋找它們。

  • 使用C-Reduce之類的工具將您的程序縮減為一個較小的程序,該程序仍然無法正常運行,但足夠短,無法完整地在此處發布。

  • 閱讀並按照文章“ 如何調試小程序 ”中的說明進行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM