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

时间:2014-04-18 20:58:03

标签: 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,而不是文件中的字符串。

例如,字符串的strlen"你好"如果除了文件的最后一行以外的任何地方,则返回6。 如果它在文件的最后一行,则strlen返回5.

我做错了吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

建议摆脱可能尾随的'\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" { {1}}从底层IO请求数据。鉴于编辑器之间的变化,代码正在读取的文本文件可能使用意外的行结尾,并且未按照提及进行翻译。