2017-03-17 22 views
0

這是我的代碼的一部分。這是非常簡單的,但是當我打開log.txt中沒有這個fprintf不適用於c中的scanf

int main() 
{ 

    FILE *fp = fopen("log.txt", "w+"); 
    fprintf(fp, "%s\t%s\t%s\n", "Date", "Time Execution Time(ms)", "/path"); 
    char path[200]; 
    while (1) 
    { 

     printf("enter path : "); 
     scanf("%s", &path); 

     fprintf(fp, "%d-%d-%d %d:%d:%d\t%ld\t%s\n", tm.tm_year + 1900, 
       tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 
       elapsed, path); 
    } 
} 

什麼,但這種變化是工作

int main() 
{ 

    FILE *fp = fopen("log.txt", "w+"); 
    fprintf(fp, "%s\t%s\t%s\n", "Date", "Time Execution Time(ms)", "/path"); 
    char path[200]; 

    printf("enter path : "); 
    scanf("%s", &path); 

    fprintf(fp,"%d-%d-%d %d:%d:%d\t%ld\t%s\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,elapsed,path); 
} 

與此代碼的工作太:

int main() 
{ 

    FILE *fp = fopen("log.txt", "w+"); 
    fprintf(fp, "%s\t%s\t%s\n", "Date", "Time Execution Time(ms)", "/path"); 

    while (1) 
    { 

     fprintf(fp, "%d-%d-%d %d:%d:%d\t%ld\t%s\n", tm.tm_year + 1900, 
       tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 
       elapsed, "kkjk"); 
    } 
} 

但我不知道爲什麼第一個代碼不起作用。請幫助我

+3

最後的程序將是一個無限循環。就像第一個程序一樣。你應該在某個時候退出循環。 –

+1

'scanf(「%s」,&path)'應該是'scanf(「%s」,路徑)''。 –

+1

如果您處理完文件,請務必關閉文件。 – muXXmit2X

回答

3

您正遇到緩衝問題。

在第二個示例中,應用程序退出的位置有一個隱式的fclose(),它會將所有數據寫入磁盤。

嘗試在循環中寫入後添加fflush(fp)以強制刷新任何掛起的寫入。如果要禁用/更改緩衝,請查看setvbuf()。 嘗試在fopen()之後加入setlinebuf(fp),以使蒸汽管線得到緩衝 - 當寫入新的生產線(\n)時,系統將有效地爲您調用fflush()

您上一次程序工作的原因是您要非常快地提交默認塊緩衝區,並繼續進行。如果檢查,則文件實際上不會與您認爲的位置同步,直到下一個塊被填充並寫入磁盤。 您可以通過再次運行您的第一個示例來嘗試此操作。這次給批次的輸入 - 最終你會看到整個負載的數據出現在文件中,然後什麼也沒有,沒有,然後很多。

+0

非常感謝。我的問題已經用fflush解決了 – taranom