2016-12-03 20 views
1

我有一個文件,該文件存儲在用戶的輸入(標準輸入)串在文件的結尾刪除新的空行

然而,有2種情況

如果我正常讀取它,我的文件將有由於用戶引入的最後一個字符串中的換行符,在其末尾處爲空行。

如果我從輸入字符串中刪除\n,則文件將所有字符串存儲在同一行中,這是不需要的。

如何從文件末尾簡單地刪除該新行?

如果需要,我可以編輯並提供一些我的代碼。

編輯:比方說,一個文件我已經有了的最後一行是「卡」

當光標在「卡」前,如果我按向下箭頭它不轉到下一行,而在這種情況下,它可能發生一次。

對於我的代碼功能完美,我不能讓這種情況發生,

這裏是什麼,我有一個例子:

f=fopen(somefile, "w"); 
do 
{ 
    fgets(hobby, 50, stdin); 
    fprintf(f, "%s", hobby) 

} while(strcmp(hobby,"\n") != 0); 
+1

你如何閱讀這些文字?你如何儲存這些線?你在哪裏儲存線?你能否請嘗試創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示? –

+0

如果您使用奇怪的編輯器來查看它,它只會在其末尾顯示一條空行。通常情況下,唯一不以'\ n'結尾的文本文件是空文件(包含0行)。 – melpomene

+2

也許你正在用文本編輯器查看文件,並認爲有一個「額外的行」,因爲光標位於下一行。事實並非如此,那只是下一行尚未存在的第一個字符的打字位置。 –

回答

4

在文件末尾的換行符是最後一行的部分。刪除它是可能的,但使最後一行不完整,這將打破許多程序。例如,連接此文件末尾的另一個文件將導致最後一行與連接文件的第一行合併。

Yuri Laguardia評論說,如果您以後在附加模式下重新打開此文件以寫入更多行,則添加的第一個將在此最後一個不完整行的末尾連接起來。可能不是預期的行爲。

如果您不希望該文件包含空行,寫入行到文件之前檢查用戶輸入:

void input_file_contents(FILE *fp) { 
    char userinput[80]; 
    printf("enter file contents:\n"); 
    while (fgets(userinput, sizeof userinput, stdin)) { 
     if (*userinput != '\n') { 
      fputs(userinput, fp); 
     } 
    } 
} 

編輯:

您的代碼不會在測試結束正確的地方:你在之前寫空行測試。不要使用do/while循環:

f = fopen(somefile, "w"); 
if (f != NULL) { 
    /* read lines until end of file or empty line */ 
    while (fgets(hobby, 50, stdin) != NULL && *hobby != '\n') { 
     fputs(hobby, f); 
    } 
} 

換行符實際上是遺留系統對字節<CR><LF>的。

+0

如果OP只是決定在追加模式下再次打開同一文件以添加更多行,則會發生同樣的不良行爲,所以我完全同意這個答案。 – yLaguardia