2017-07-25 191 views
2

我有一個c代碼,只是從txt文件中讀取一行。該文件只有一個行是如下:C - fgets跳過CR字符

Content of txt file

的代碼片段閱讀這條線是:

int** readFile(char* filename){ 

    int col=0, row =0; 
    int i=0; 
    int* numList[2048]; 

    for(int i = 0; i<2048; i++) 
     numList[i] = (int*) malloc(6*sizeof(int)); 

    if(NULL == numList){ 

     printf("Memory error!"); 

    } 

    char * token = NULL; 

    char currentLine[25] = {'\0'}; 

    FILE* file = fopen(filename, "r"); 

    if(NULL != file){ 

     printf("File is opened successfully\n"); 

     if(NULL != fgets (currentLine, 60, file)) 
     { 
      int i = 0; 
      while (NULL != currentLine[i]){ 

       printf("%d ", currentLine[i]); 
       i++; 
      } 
     } 
    } 
    else 
    { 
     printf("File I/O Error"); 
     return NULL; 
    } 

    fclose(file); 

    return numList; 
} 

運行此代碼時,我得到以下的輸出:

Output of program

我觀察到一些可疑的東西,就像您在第一張截圖(txt文件的內容)中看到的那樣,Notepa d ++在行尾顯示CR LF。但在輸出中,我看到10是LF的最後一個字符。

也許我錯過了一個非常原始的點但我不明白爲什麼CR字符不存在。

不用說,平臺是Windows,這是一個控制檯程序。

謝謝&此致敬禮。

+4

1)在Windows環境中,相互轉換(LF <-> CRLF)是在文本模式輸入/輸出中完成。 – BLUEPIXY

+4

2)'60' <->'25'不符合大小。 – BLUEPIXY

+2

您已將'numList'聲明爲具有自動存儲類的數組(即它是堆棧中的局部變量),並且在函數結尾處有'return numList;'。這將返回一個指向棧上變量的指針,這會導致_undefined behavior_。 –

回答

8

您正在打開文件文本模式。此模式可確保您可以在任何平臺上處理相同的文本文件。

C指定'\n'作爲行尾。在Windows中,行末尾是序列"\r\n"。 C(在這種情況下,執行stdio的標準庫)會自動爲您翻譯。從文本模式的Windows上的文件讀取將只給\n\r\n

如果你想清楚地看到該文件的字節內容,你有二進制模式,而不是將其打開:

FILE* file = fopen(filename, "rb"); 
+0

謝謝!這是我正在尋找的答案。 –

+1

@UgurKAYA YW。仍然看看你收到的所有評論,你顯示的代碼段存在一些嚴重的問題。我只回答你當前的問題,忽略這些問題。 –

+0

是的,你是對的。這不是項目中的確切代碼,它有點簡化。而且它不是該項目的確切txt文件,但是,仍然是,有一些問題,我感謝大家描繪它們。 –