如何在matlab中将格式写入fscanf?

时间:2013-05-09 07:07:35

标签: matlab

我有类似的东西:

1  1  1 2 3 10 17 16 15 8 9 
2  1  3 4 5 12 19 18 17 10 11
3  1  5 6 7 4 21 20 19 12 13
4  1  15 16 17 24 31 30 29 22 23

第1栏:编号
第二栏:模式
第3至第12栏:点

我写了这个fscan的格式。

for no=1:4    
    no=fscanf(FID5, '%d', 1);
    mode=fscanf(FID5, '%d', 1);
    point=fscanf(FID5, '%d  %d  %d  %d  %d  %d  %d  %d  %d',[9,1]);

    fprintf(FID6, '%-2d           %-2d        %-2d  %-2d  %-2d  %-2d  %-2d  %-2d  %-2d  %-2d  %-2d\n',no,mode,point); 

end

我期待:

point=size(no,9)

但 我得到了

point=size(1,9)

你能告诉我怎么解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

解决方案中的问题

让我们尝试修复您当前的解决方案:主要问题是您在每次迭代中只读取一行值points,覆盖之前存储的任何内容。尝试修改代码,如下所示:

point = zeros(4, 9);  %// Add this line to preallocate memory for 'point'
for no = 1:4

    %// ...
    point(no, :) = fscanf(FID5, '%d  %d  %d  %d  %d  %d  %d  %d  %d',[9,1]);
    %// ...
end

对于您在循环中使用fscanf阅读的所有内容,情况也是如此。在循环之前为您读取的数据预分配数组,并在每次迭代中将其读入不同的行。

此外,您的代码还有另一个错误:

no=fscanf(FID5, '%d', 1);  %// BAD! no' is used as the loop iteration variable

您在循环中使用循环变量no来存储您读取的数据。这是一个肯定的禁忌!您应该将数据读入另一个变量(例如,row_no)。

有更好的解决方案吗?

然而,这太麻烦而且不通用。请考虑使用强大的textscan命令,而不是for循环和fscanf,如@fpe建议:

C = textscan(FID5, '%d', 11);
row_no = cell2mat(C(2));
mode = cell2mat(C(2));
point = cell2mat(C(3:end));

答案 1 :(得分:0)

你不能这样做:

format = repmat('%d',1,11);
fid = fopen(filename,'r');
A = textscan(fid,format,'Delimiter','\n');