在做一个实验的时候,需要将文件中的数据逐行读入,在读入的时候遇到了一个问题,前面几行的数据读入正常,最后一行数据的读入会少一个数据,数据格式如下
注意箭头处,这里是文件的末尾了,前面的数据之后都跟了一个换行符,最后一行数据没有换行就直接结束了。
我之前的做法是
while (!feof(fin)) { if (fgets(word, 64, fin) == NULL) break; word[strlen(word) - 1] = '\0'; ......
代码并不完整,但是已经能够说明问题了,我是想在读入数据时不要读入多余的符号,如换行。
fgets(char *str, int n, FILE *stream)函数会一直读入数据,直到读入数据个数为n-1,这时在str末尾添加 '\0‘ ,读入结束。或者是读入换行符或文件结束符,函数会将读入的换行符添加到str末尾,但不会将文件结束符添加到str末尾。
我们来试验一下对不对
第一行是我设置的试验数据,输入中文会影响判断,我将n的大小改成了17,并在word读入后加入了断点
结果是,word读入了16个数据
再将n改回原来的大小再看一下,正常的读入是下面这样
最后一行元素读入是这样,文件结束符EOF没有被写进去
用最开始的做法会导致最后的“24”的“4”被改成“\0",所以最后的数据丢失
像这样加个判断就好了
结果正确了