我想从文本文件中读取字符串(每行一个字符串/单词),然后按大小排列它们。
这是我的代码:
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/