2013-09-28 22 views
1

我正在閱讀一個文本文件(寫在UNIX或Linux機器上),應該在每行上有一個條目。當我用我的程序讀取它並將文件內容輸出到控制檯時,其他每個條目都有一個額外的換行符,並且每行重複兩次。下面是代碼;行讀取兩次,並與所有其他有額外的換行符

FILE* fullList; 
char sline[21]; 
fullList = fopen("fullList", "r"); 
if(fullList == NULL) 
    exit(EXIT_FAILURE); 
while(fgets(sline, sizeof(sline), fullList) != NULL) 
{ 
    puts(sline); 
    printf(sline); 
} 
fclose(fullList); 

因此,如果輸入文件包含

apple 
banana 
orange 
zucchini 
cucumber 
eggplant 

程序會顯示爲

apple 

apple 
banana 

banana 
orange 

orange 
zucchini 

zucchini 
cucumber 

cucumber 
eggplant 
eggplant 

我不知道是什麼做的。我必須在使用前再清楚一點嗎?

+0

注意,使用'的printf(SLINE)'是danerous如果'sline'含有任何''%符號,你是作爲崩潰的printf'很容易( )'嘗試訪問你沒有傳遞給它的參數。使用:'printf(「%s」,sline)'代替;這是安全的。 –

回答

3

這是因爲您打印每一行兩次 - 一次通過放入,一次通過printf。

fgets捕獲換行\nputs附加自己的'\n',所以在第一次打印輸出後還有一個換行符。

文件的最後一行("eggplant")缺少尾隨'\n',所以在兩個茄子打印輸出之間沒有多餘的空白行。

要解決此問題,請先停止調用某個打印功能。接下來,確保您閱讀的行最後沒有\n。你既可以剝奪其關閉自己,或使用

while (fscanf(fulllist, "%20s", sline) == 1) { 
    ... 
} 

這是不可取的調用printf與您的形式參數的點串,因爲有意外的格式符號有可能會導致不確定的行爲。如果你決定使用printf,按如下方式使用它:

printf("%s\n", sline); 
+0

奇怪的是我擺脫了'fputs()',它修復了一切,包括額外的換行符。 – Celeritas

+0

@Celeritas在最後一行(即茄子)之後不應該換行,對吧? – dasblinkenlight

3

你認爲這樣做是什麼?

puts(sline); 
printf(sline); 

第一個打印行(後面是換行符!)。第二個打印行,但以特殊方式格式化以%開頭的任何內容。因此puts()爲您提供了一個額外的換行符,但printf()更糟 - 查閱文檔並考慮如果您的文件包含「%s」或「%d」會發生什麼情況。

所以你只想使用一個輸出語句,而你不需要雙換行符。您可以在打印前從每行中刪除換行符,但更好的方法是使用fputs(sline, stdout),它不會添加換行符。另外,有一點建議:使用C來處理文本文件對於你來說會非常痛苦(作爲C的新手)。我建議使用其他語言,例如Python,Ruby,awk,sed或其他任何基於您的需求和經驗的語言。

相關問題