2014-04-18 25 views
2

我想從文本文件(每行一個字符串/字)讀取字符串,然後按大小排列它們。C - 從文本文件中讀取字符串並按大小排列

這是我的代碼:

void readDic(char* file) 
{ 
    FILE* fr; 
    fr=fopen(file, "rt"); // opening the text file 
    char line[MAX_LINE_SIZE]; 
    char* word; 
    while(fgets(line, MAX_LINE_SIZE, fr)!=NULL) 
    { 
     if(line[0]!='\n') 
     { 
      word = strtok(line, "\n"); //remove the newline from the string 
      // do stuff with word 
     } 
    } 
    fclose(fr); 
} 

儘管此代碼代碼運行時,每串我看了,除了最後一個,配備了尺寸的+1比一個的文件中。

例如,字符串「hello」的strlen返回6,如果它除了文件的最後一行以外的任何地方。 如果它在文件的最後一行strlen返回5.

我做錯了什麼?

+2

需要更多代碼。你的例子並沒有顯示你如何確定單詞的長度。 – JohnH

+0

如果'strlen(x)',其中'x'應該是「hello」,返回6,那麼檢查第六個字符是什麼是個好主意。它可能像'\ r'。 (進一步思考:這也可能是第一個*的位置。) – usr2564301

回答

1

fgets()不讀取C字符串。它讀取chars,直到遇到'\n'(或EOF條件或IO錯誤或緩衝區將近填滿)。然後它將一個附加到緩衝區,使緩衝區成爲C字符串。

在致電fgets()後,很好地檢查它的返回值 - 這個代碼做了什麼。如果NULL存在EOF條件或IO錯誤。否則,緩衝區包含一個C字符串:1)一個數組char,2)通常最後一個是'\n'和3)附加的'\0'

看起來strlen(line)的超長結果來自'\n',它是文本文件的最後一行沒有的。

建議,以擺脫可能尾隨'\n'

size_t len = strlne(line); 
if (len > 0 && line[len-1] == '\n') line[--len] = '\0'; 

行結束系統之間有所不同:"\r\n""\n"很受歡迎,但"\n\r""\r"時有發生。通過打開文件文本文件"rt"或更便攜的"r",系統的典型行結束被轉換爲"\n",因爲fgets()請求來自底層IO的數據。鑑於編輯者之間的品種,有可能代碼正在閱讀的文本文件使用意外的行結束,並且不像上述那樣翻譯。

相關問題