C - fgets 跳过 CR 字符

标签 c console fgets carriage-return linefeed

我有一个c代码,只是从一个txt文件中读取一行。该文件只有一行,如下所示:

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 文件的内容)中看到的那样,Notepad++ 在该行的末尾显示了 CR LF。但在输出中,我看到 10 作为最后一个字符,即 LF。

可能我遗漏了一个非常原始的点,但我无法理解为什么不存在 CR 字符。

不用说,平台是windows,这是一个控制台程序。

谢谢&问候。

最佳答案

您正在以文本模式打开文件。此模式确保您可以在任何平台上以相同的方式处理文本文件。

C 将'\n' 指定为行尾。在 Windows 中,行尾是序列 "\r\n"。 C(在这种情况下,实现 stdio 的标准库)会自动为您翻译。在 Windows 上以文本模式读取文件将只为 \r\n 提供 \n

如果你想准确地看到文件的字节内容,你必须以二进制模式打开它:

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

关于C - fgets 跳过 CR 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45304115/

相关文章:

c - 反转列表而不复制(递归方法)

javascript - 如何借助脚本更快地在 "People you may know"部分添加 Linkedin 连接?

azure - 等待 azure 管道中的控制台输出

c - 从 fgets() 输入中删除换行符

c - 使用 fgets() 在同一行打印两个字符串

c - 将性能关键循环从 C 翻译成 Rust

c - 如何计算匹配数?

检查用户输入是 float 还是整数

javascript - 如何在控制台中获取特定的 Controller 范围列表 - angularjs?

c - 尝试加载链表时 Malloc 崩溃