2017-07-25 154 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文件,但是,仍然是,有一些问题,我感谢大家描绘它们。 –