【问题标题】:C - Reading strings from a text file and arranging them by sizeC - 从文本文件中读取字符串并按大小排列
【发布时间】:2014-06-03 10:35:55
【问题描述】:

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

这是我的代码:

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。

我做错了吗?

【问题讨论】:

  • 需要更多代码。您的示例没有显示您如何确定单词的长度。
  • 如果strlen(x)(其中x 应该是“hello”)返回6,那么检查第6 个字符是什么可能是个好主意。它可能类似于\r。 (进一步思考:这也可能在 first 位置。)

标签: c string file text strlen


【解决方案1】:

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" 已经出现。通过将文件打开为 text 文件"rt",或更便于使用"r",系统的典型行尾将转换为"\n",因为fgets() 从底层IO 请求数据。鉴于编辑器之间的差异,代码正在读取的文本文件可能使用 unexpected 行结尾,并且未按上述方式进行翻译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 2016-01-15
    • 2020-08-19
    • 1970-01-01
    • 2012-02-10
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多