我想从文本文件中读取字符串(每行一个字符串/单词(,然后按大小排列它们。
这是我的代码:
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"
。 给定编辑器之间的差异,代码正在读取的文本文件可能使用意外的行尾,并且未按所述进行翻译。