刪除輸出重定向> test.txt
你在本質上說的是:
您的控制檯通常有三個標準流stdin
, stdout
and stderr
。這些流你可以redirect。如果你在Windows上也看,例如redirection。
當你說./my_prog > test.txt
,你告訴你的控制檯(不my_prog
),是寫什麼my_prog
寫入stdout
到文件test.txt
。
如果您在您的代碼中說,即printf("Hello");
,那麼您好將被寫入文件test.txt
。
如果你改變了你的重定向,改爲./my_prog < test.txt
, 將文件test.txt流式傳輸到my_prog。反過來,如果test.txt中有任何文本,則會生成test.txt到text.txt的副本。
現在在你的代碼你說:
int main(void)
{
int ch;
FILE *input;
/* Here you open a handle to the file text.txt for reading and writing */
input = fopen("text.txt", "w+");
while ((ch = getchar()) != EOF) { /* get next char from stdin */
fputc(ch, input); /* write that char to the handle input */
}
fclose(input); /* close the handle */
return 0;
}
所以會發生什麼,你運行它的方式是:
在您的代碼:
- 開放的text.txt
- 等待輸入(數據輸入到標準輸入) - 通常用戶輸入文本到控制檯,傳遞給編程輸入是預先ssed。
在控制檯:
- 重定向從
my_prog
什麼TEST.TXT。
你說:
腳本沒有達到EOF
好,因爲它從stdin
讀取兩個條件下,它只會(沒有例外)得到EOF 。
如果您將文件重定向到您的程序。即./my_prog < foo.txt
(通知<
,而不是>
)。
- 然後會發生什麼my_prog
會讀取文件foo.txt
中的數據,當該文件結束時,您的程序將收到一個EOF。然後,因此退出。
如果您手動輸入EOF到stdin
。
- 在Linux和OSX 按Ctrl - d,在Windows 按Ctrl - ž
現在,如果你鍵入文本安慰記得測試此像fputc()
這樣的寫入操作被緩衝。這意味着數據不會立即寫入文件,但只有在給定數量的數據處於緩衝區時,纔會調用fflush()
,關閉流,關閉緩衝區等。
另外;如果你運行你的程序。輸入文本,輸入更多文本,然後點擊Ctrl-C放棄該程序,這是一個很大的機會,你在text.txt
沒有數據結束。
其原因是程序被終止,因此fclose()
從未被調用過,因此沒有刷新文件。
在編程上的進一步努力,這是一個非常好的主意,養成不假設任何東西的習慣。即不要假設fopen()
是可以的。
FILE *fh;
char *outfile = "foo.txt";
if ((fh = fopen(outfile, "w")) == NULL) {
fprintf(stderr,
"Unable to open file %s\n --",
outfile);
perror(" fopen() ");
return 1;
}
大多數函數都有檢查操作是否成功的方法。即:
if (fputc(ch, fh) != ch) { err ...
這會讓你的代碼安全很多,給你提示在哪裏失敗等
一些鏈接:
'./fputc> test.txt'將截斷'test.txt'。你有兩個文件(test.txt和text.txt)嗎?你想用一個作爲輸入嗎? (這真的不清楚。) – Mat 2012-04-01 08:45:30
此代碼未能檢查'fopen'調用的結果以確定它是否成功,但這不是當前問題的原因。它還應該檢查'fclose'的結果。 – 2012-04-01 23:31:39