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。

我做错了什么吗?

fgets()不读取 C 字符串。 它读取chars,直到遇到'n'(或EOF条件,或IO错误或缓冲区几乎被填满(。 然后,它将''追加到缓冲区,使缓冲区成为 C 字符串。

调用fgets()后,最好检查其返回值 - 此代码确实如此。 如果NULL,则存在 EOF 条件或 IO 错误。 否则,缓冲区包含一个 C 字符串:1( 一个 char 数组,2( 通常最后一个是 'n' 和 3( 附加的 ''

strlen(line)看似超长的结果来自 'n' ,文本文件的最后一行没有。

建议摆脱可能尾随'n'

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

行尾因系统而异:"rn""n"很受欢迎,但"nr""r"已经发生。 通过将文件作为文本文件打开"rt",或者使用"r"更便携,系统的典型行尾在fgets()从底层IO请求数据时转换为"n"。 给定编辑器之间的差异,代码正在读取的文本文件可能使用意外的行尾,并且未按所述进行翻译。

相关内容

  • 没有找到相关文章

最新更新