在做一个实验的时候,需要将文件中的数据逐行读入,在读入的时候遇到了一个问题,前面几行的数据读入正常,最后一行数据的读入会少一个数据,数据格式如下

 注意箭头处,这里是文件的末尾了,前面的数据之后都跟了一个换行符,最后一行数据没有换行就直接结束了。

我之前的做法是

    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",所以最后的数据丢失

 像这样加个判断就好了

 结果正确了

01-05 15:37