北太天元和MATLAB对文件末尾判断的区别

标签: 问题反馈——功能问题

邱彼郑楠 2025-02-20 09:47:43

首先生成一个测试文件,第一行类似于表头,2到4行每行存储3个数,用tab键分隔

fwid = fopen("test.txt", "w");
fprintf(fwid, "%s\t%s\t%s\n", "column_1", "column_1", "column_3");
fprintf(fwid, "%d\t%d\t%d\n", 1, 2, 3);
fprintf(fwid, "%d\t%d\t%d\n", 4, 5, 6);
fprintf(fwid, "%d\t%d\t%d\n", 7, 8, 9);
fclose(fwid);

得到的文件共5行,第5行是一空行。下面以 fgetl 函数逐行读取该文件。

方法一:

以 feof 函数作为 while 循环的判断条件,依次读取文件的每一行并显示出来

frid = fopen("test.txt", "r");
fgetl(frid);
% 是否到达文件末尾 (EOF)
while ~feof(frid)
    line = fgetl(frid);
    disp(line);
end
fclose(frid);

该方法在北太天元中除了显示文件中的3行数字,还会显示一个-1,这个-1是fgetl判断到文件末尾后返回的。而在 MATLAB 中只显示 3 行数字。

屏幕截图 2025-02-20 091637.png屏幕截图 2025-02-20 091816.png

方法二:

考虑到方法一中 fgetl 函数返回了 -1 但 feof 条件没有起作用,将 while 循环条件改为 true,循环内部满足 feof 条件 break 循环。

frid = fopen("test.txt", "r");
fgetl(frid);
while true
    line = fgetl(frid);
    % 如果到达文件末尾,则退出循环
    if feof(frid)
        break;
    end
    disp(line);
end
fclose(frid);

该方法在北太天元中输出符合预期,但在 MATLAB 中只输出两行数据

屏幕截图 2025-02-20 092237.png屏幕截图 2025-02-20 092913.png

也就是说,在北太天元中,读取了 7 8 9 三个数后,需要再读取一行才到末尾 (EOF),所以读取到的 -1 没有 disp;而在 MATLAB 中,读取了之后已经到末尾,虽然读取了这三个数,就跳出循环不再显示。代码中的 if 判断更换任意位置在北太天元中都将显示 -1。

验证:

手动逐行读取文件进行验证

frid = fopen("test.txt", "r");
fgetl(frid);
disp(feof(frid));
fgetl(frid);
disp(feof(frid));
fgetl(frid);
disp(feof(frid));
fgetl(frid);
disp(feof(frid));
fgetl(frid);
disp(feof(frid));
fclose(frid);

在北太天元和 MATLAB 中输出的结果分别是

屏幕截图 2025-02-20 094137.png屏幕截图 2025-02-20 094435.png

测试文件共 5 行,前四行有内容,第五行是空行,在 MATLAB 中,读取完第四行就判断为文件末尾,而在北太天元中,五行全部读完才判断是文件末尾。

回复

回复

重置 提交