我想从文本文件中读取字符串(每行一个字符串/单词),然后按大小排列。
这是我的代码:
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.
我做错了吗?
答案 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请求数据。鉴于编辑器之间的变化,代码正在读取的文本文件可能使用意外的行结尾,并且未按照提及进行翻译。