我目前正在尝试从这样写的文本文件中读取数据:
Height = 10
Length = 10
NodeX = 11
NodeY = 11
K = 10
我写了一个像这样的小代码
fileID = fopen('input.dat','r');
[a, b] = fscanf(fileID, '%s %f')
我得到以下答案:
a =
72
101
105
103
104
116
b =
1
似乎很明显我没有指定格式规范。 我想知道如何在同一个文件中多次选择一个字符串和一个浮点数。
答案 0 :(得分:2)
fscanf
函数是一个低级I / O函数,通常不是这种高级文件输入的最佳选择。另一种方法是使用textscan
函数,它允许非常高级的格式规范:
fileID = fopen('input.dat','r');
C = textscan(fileID,'%s = %d')
创建1x2单元阵列。第一个单元格C{1}
包含另一个5x1单元格,其中每个字段包含字段的名称,例如'Height'
。第二个单元C{2}
包含一个5x1向量,其中包含文件中的所有整数值。
答案 1 :(得分:2)
fscanf
状态为the documentation:
如果
formatSpec
包含数字和字符的组合 说明符,然后fscanf
将每个字符转换为其数字 当量。即使格式明确,也会发生此转换 跳过所有数值(例如,formatSpec
为'%*d %s'
)。
MATLAB在阅读混合数据类型时会非常糟糕。一种可能的替代方法是读取每一行并使用简单的正则表达式分割数据:
fileID = fopen('results.txt','r');
mydata = {};
ii = 1;
while ~feof(fileID) % While we're not at the end of the file
tline = fgetl(fileID); % Get next line
mydata(ii,:) = regexp(tline, '([a-zA-Z])* = (\d*)', 'tokens');
ii = ii + 1;
end
fclose(fileID);
这将返回一个5 x 1
单元格数组,其中每个单元格包含与您的数据匹配的2个单元格(稍微烦人,但您可以将其拉出)。在这种情况下,mydata{1}{1}
为Height
,mydata{1}{2}
为10
。
编辑:
您可以通过reshape
调用来展平您的手机阵列:
mydata = reshape([mydata{:}], 2, [])';
在这种情况下,mydata
变为5x2
单元格数组。