[英]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);
那不會改變您在文件中的位置,但是它允許您從一直在寫入的文件中讀取內容。
哦, ftell
和fseek
具有long
值,而不是int
。 如果文件不是太大,則程序(帶有這些修復程序)可能會運行,但是您實際上應該將t
聲明為long
變量。
我還建議使用諸如d
, w
和t
使您的代碼更難以閱讀。 使用更長的描述性名稱。 除了嘗試閱讀和理解您的代碼之外,請考慮其他人-或者您從現在開始每個月都在忘記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.