C - 从文本文件中读取字符串并按大小排列

标签 c string file text strlen

我想从文本文件中读取字符串(每行一个字符串/单词),然后按大小排列它们。

这是我的代码:

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。

我做错了什么吗?

最佳答案

fgets() 不读取 C 字符串。它读取 chars 直到遇到 '\n'(或 EOF 条件,或 IO 错误或缓冲区几乎已满)。然后它将一个 '\0' 附加到缓冲区,使缓冲区成为一个 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 请求数据。考虑到编辑器之间的差异,代码正在读取的文本文件可能使用了意外行结尾,并且未按上述方式翻译。

关于C - 从文本文件中读取字符串并按大小排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162225/

相关文章:

Python - 如果有 "exact"匹配则返回值?

java - 查找重复相邻元素时字符串索引超出范围?

mysql - 加载大量学生表,但学校仅在第一行标识

c - 倒带第二次打印文件元素

c - Orwell 的 MinGW 和 TDM Dev-C++ 版本有什么区别?

c - 堆没有变化?

C++ 不允许我比较指针和 int

c - 如何从函数返回字符串数组

c - C 编程中从服务器到客户端的文件传输

c - 如何仅针对特定行将文本文件中的单词读入数组?