簡體   English   中英

fprintf沒有打印到文件

[英]fprintf is not printing to the file

在以下代碼中,fprintf未打印到文件,並且printf顯示錯誤的輸出:

#include<stdio.h>

 void main()
{  
    FILE *fp;  
    int d,w,t;
    fp = fopen("file.txt","r+");//already created file having value 10
    fscanf(fp,"%d",&d); 
    printf("%d",d);//print value 10
    t=ftell(fp);
    fseek(fp,t,SEEK_END);
    fprintf(fp,"%d",1000); // printing 1000 to the file
    fscanf(fp,"%d",&w);
    printf("%d",w); // this printf is still printing wrong value 12803
    fclose(fp);
    getch();
}
#include<stdio.h>

 void main()

這是錯誤的; 它應該是int main(void) 如果您有一本書告訴您使用void main() ,那么它的作者不太了解C。 得到一本更好的書。

{
    FILE *fp;
    int d,w,t;
    fp = fopen("file.txt","r+");//already created file having value 10

您需要檢查fopen調用是否成功,並且如果失敗則可能終止程序。

    fscanf(fp,"%d",&d);
    printf("%d",d);//print value 10

假設到目前為止一切順利,這將在不使用換行符的情況下輸出10 如果您的程序有效,則其輸出將為101000 將“%d”更改為“%d \\ n”。

    t=ftell(fp);

t是文件中的當前位置,應該在10后面,因此它是從開始起2個字節。

    fseek(fp,t,SEEK_END);

現在,您將文件指針重新定位到文件末尾之前的 2個字節。 那沒有任何意義。 相對於“ 10”的最終位置取決於file.txt其他內容(換行符?CR-LF?)

您可以保存ftell()返回的值,並稍后在調用fseek使用它,但這僅在第三個參數為SEEK_SET 因此,您可能想要:

t = ftell(fp);
fseek(fp, t, SEEK_SET);

那不會改變您在文件中的位置,但是它允許您從一直在寫入的文件中讀取內容。

哦, ftellfseek具有long值,而不是int 如果文件不是太大,則程序(帶有這些修復程序)可能會運行,但是您實際上應該將t聲明為long變量。

我還建議使用諸如dwt使您的代碼更難以閱讀。 使用更長的描述性名稱。 除了嘗試閱讀和理解您的代碼之外,請考慮其他人-或者您從現在開始每個月都在忘記d情況下閱讀自己的代碼。

進行了這些更改后,您在file.txt should now be just after the的當前位置file.txt should now be just after the

    fprintf(fp,"%d",1000); // printing 1000 to the file

現在,您在10之后立即打印1000 ,因此文件包含101000 ,並且當前位置您寫入的最后一個字符之后

    fscanf(fp,"%d",&w);

在這里,您嘗試在寫入文件后立即讀取文件。 但是,您位於文件的結尾,因此沒有什么可讀取的。 由於您沒有檢查fscanf的結果(這會告訴您它失敗了),因此w不變,

    printf("%d",w); // this printf is still printing wrong value 12803

同樣,添加換行符會使輸出更易於閱讀。

    fclose(fp);
    getch();

getch()是Windows特定(和MSDOS特定)的函數,在終止程序之前等待用戶輸入。 如果您堅持使用它,並且我沒記錯的話,您需要#include <windows.h> 如果編譯器沒有抱怨getch缺少聲明,則應提高編譯器的警告級別。

}

摘要:

如果要讀取和寫入相同的打開文件,則可以執行此操作-但需要在讀取和寫入之間或在寫入和讀取之間調用某些定位功能,例如fseek

您應該檢查所有庫調用返回的值。 例如,如果file.txt不存在,則您的程序會悄悄地忽略該錯誤,並繼續嘗試讀取和寫入文件,結果未定義。 (通常會忽略printf調用的結果,因為如果打印到標准輸出失敗,您將無能為力,但是無論如何看一下結果都是有啟發性的。)

編寫printf調用,使輸出可讀。 在每行輸出的末尾打印換行符( \\n )。

閱讀您使用的每個功能的文檔。

請您的編譯器警告您有關可疑構造的信息。 請參閱編譯器的文檔,以了解如何執行此操作。

您需要在同一文件的讀取和寫入之間執行fseek() (或類似操作)。 這不是所有實現中的嚴格要求,但對於可移植性是必需的。


編輯

好的,您的新版本具有:

t=ftell(fp);
fseek(fp,t,SEEK_END);

在某些情況下這可能很有意義,但可能並非如此。 我想你的意思是:

fseek(fp, 0, SEEK_CUR);

相對於當前位置進行搜索,而不實際移動到任何位置。

但是沒有得到w==1000的原因是在這兩行之間:

fprintf(fp,"%d",1000); // printing 1000 to the file
fscanf(fp,"%d",&w);

您可以從寫作過渡到閱讀,而無需在這里尋求幫助。 您無法完全確定要嘗試從中讀取w的文件中的哪個位置,而無需使用尋求重新確定您想要的位置的嘗試。

嘗試:

t = ftell(fp);
fprintf(fp,"%d",1000); // printing 1000 to the file
fseek(fp, t, SEEK_SET);
fscanf(fp,"%d",&w);

順便說一句,此代碼周圍還有很多其他危害。 就像fprintf不會打印任何終止符一樣,因此在您寫入的位置(之前寫入的其他值,或其他值)之后可能會有尾隨的數字,這些數字將附加到讀入w的值之后。

暫無
暫無

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

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