gpt4 book ai didi

matlab - fscanf 函数的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:13 24 4
gpt4 key购买 nike

我正在尝试使用 Matlab 的 fscanf 函数读取包含在一个小配置文件中的信息。文件内容为;

YAcex: 1.000000
YOx: 1.000000
KAce: 1.000000

用于解析文件的matlab代码为;

fh = fopen('parameters', 'r');
fscanf(fh, 'YAcex: %f\n')
fscanf(fh, 'YOx: %f\n')
fscanf(fh, 'KAce: %f\n')
fclose(fh);

调用此脚本时,只有“YAcex”行被正确读取; fscanf 为另外两行返回 []。如果交换了 YOx 和 KAce 线(KAce 在 YOx 之前),fscanf 会正确读取所有线。

有人可以解释这种行为吗?

补充信息:输入文件中的换行符是简单的换行符(\n字符,没有\r字符)。

最佳答案

您的问题是每次调用 fscanf 时您只想读取一个值,但默认情况下它会尝试读取尽可能多的值。请注意文档中的这段摘录:

The fscanf function reapplies the format throughout the entire file and positions the file pointer at the end-of-file marker. If fscanf cannot match formatSpec to the data, it reads only the portion that matches and stops processing.

这意味着第一次调用正确读取了文件的第一行,但随后也尝试读取下一行,但没有找到与其 format specifier 完全匹配的 .它为下一行找到一个部分匹配,其中 YOx: 的第一个 Y 匹配 YAcex: 在格式说明符中。此部分匹配将文件指针直接放置在 YOx: 中的 Y 之后,导致下一次调用 fscanf失败,因为它从 Ox: ... 开始。我们可以用 ftell 来说明这一点:

fh = fopen('parameters', 'r');
fscanf(fh, 'YAcex: %f\n');
ftell(fh)

ans =

18 % The "O" is the 18th character in the file

当你切换 YOx:KAce: 行时,下一行的部分匹配不再发生,所以文件指针结束于每次都是下一行的开头,所有读取都成功。

那么,您如何解决这个问题呢?一种选择是始终指定 size argument所以 fscanf 不会不必要地重新应用格式说明符:

fh = fopen('parameters', 'r');
fscanf(fh, 'YAcex: %f\n', 1);
fscanf(fh, 'YOx: %f\n', 1);
fscanf(fh, 'KAce: %f\n', 1);
fclose(fh);

另一种选择是在一行中完成所有这些:

fh = fopen('parameters', 'r');
values = fscanf(fh, 'YAcex: %f\n YOx: %f\n KAce: %f\n');
fclose(fh);

values 将是一个 3×1 数组,其中包含文件中的 3 个值。

关于matlab - fscanf 函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45797258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com