2012-04-01 13 views
0

我想了解如何在C中使用fputc。我已經閱讀了一些文檔,並相信我做對了。但每次嘗試使用我通過執行./fputc> test.txt所寫的腳本時,其中text.txt是包含一行文本的文本文件。瞭解fputc

這是我的腳本:

int 
main(int argc, char **argv){ 
    int ch; 
    FILE *input; 
    input = fopen("text.txt", "w+"); 
    while ((ch = getchar()) != EOF){ 
     fputc(ch, input); 
    } 
    fclose(input); 

    return 0; 
} 

我得到的編譯沒有錯誤,並出於某種原因,腳本不會在文本文件的末尾達到EOF。 getchar在到達文本文件末尾時不應返回EOF? 儘管創建了文本(text.txt)文件,但似乎並未進行編輯。所以在我的while循環中出現了一些問題。

我是C編程新手(如果你不知道),這個小腳本讓我感到困惑。

任何幫助將不勝感激,或任何鏈接到網站的進一步細節也將是偉大的。

乾杯,

S.

+0

'./fputc> test.txt'將截斷'test.txt'。你有兩個文件(test.txt和text.txt)嗎?你想用一個作爲輸入嗎? (這真的不清楚。) – Mat 2012-04-01 08:45:30

+0

此代碼未能檢查'fopen'調用的結果以確定它是否成功,但這不是當前問題的原因。它還應該檢查'fclose'的結果。 – 2012-04-01 23:31:39

回答

2

刪除輸出重定向> test.txt你在本質上說的是:

  • 控制檯:運行 MY-和寫東西它輸出給TE 小號 t.txt。

  • 程序:打開te x t.txt並將任何輸入寫入stdin至該文件。


您的控制檯通常有三個標準流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; 
} 

所以會發生什麼,你運行它的方式是:

在您的代碼:

  1. 開放的text.txt
  2. 等待輸入(數據輸入到標準輸入) - 通常用戶輸入文本到控制檯,傳遞給編程輸入是預先ssed。

在控制檯:

  1. 重定向從my_prog什麼TEST.TXT。

你說:

腳本沒有達到EOF

好,因爲它從stdin讀取兩個條件下,它只會(沒有例外)得到EOF 。

  1. 如果您將文件重定向到您的程序。即./my_prog < foo.txt(通知<,而不是>)。
          - 然後會發生什麼my_prog會讀取文件foo.txt中的數據,當該文件結束時,您的程序將收到一個EOF。然後,因此退出。

  2. 如果您手動輸入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 ... 

這會讓你的代碼安全很多,給你提示在哪裏失敗等


一些鏈接:

0

的getchar返回從標準輸入(stdin)的下一個字符。 它等同於以stdin作爲參數的getc。

因此,您的代碼從標準輸入讀取而不是FILE *輸入。

在這裏使用fgetc。 fgetc返回指定流的內部文件位置指示符當前指向的字符。內部文件位置指示符然後前進一個字符指向下一個字符。

因此,使用龜etc從文件中讀取:

while ((ch = fgetc(input)) != EOF) 
0

程序和外殼都寫的同一個文件。你應該從你的命令行