MATLAB:字符串操作和文件输入/输出

时间:2015-03-17 02:31:36

标签: matlab file-io

好的,所以我有一个类似于这个的数据文件,其中包含人名和权重:

Darby George          166.2
Helen Dee            143.5
Giovanni Lupa    192.4
Cat Donovan       215.1

我应该一次一行地将脚本读成字符串,将权重保存到矢量中,然后以“最后,第一个”的形式打印每个人的姓名。其次是体重:

George, Darby’s weight is 166.20 lbs.
Dee, Helen’s weight is 143.50 lbs.
Lupa, Giovanni’s weight is 192.40 lbs.
Donovan, Cat’s weight is 215.10 lbs.

这是我的代码:

fid = fopen('patwts.dat');
if fid == -1
    disp('File open not successful')
else
    while feof(fid) == 0
    % Read one line into a string variable
    aline = fgetl(fid);
    %Save vector and fprintf here
    strtok(aline,' ')=[first last num];
    fprintf('%s %s %3.2f',last,first,num)
    mat=['%3.2f %3.2f %3.2f %3.2f %3.2f %3.2f 3.2f %3.2f %3.2f %3.2f']
    end
    closeresult = fclose(fid);
    if closeresult == 0
        disp('File close successful')
    else
        disp('File close not successful')
    end
end
fprinf('The average weight is $sum(%3.2f)/2 lbs', num)

我遇到strtok功能问题。

我不知道如何格式化字符串以阅读'last, first' weight

2 个答案:

答案 0 :(得分:0)

[token, remain] = strtok(aline,' ')将返回第一个标记“Darby”和该行的剩余部分。我认为这不是你想要的。 我建议使用strsplit(aline, ' '),它将返回一个包含所有标记的单元格,你需要通过执行for循环来获取每个“first,last,num”(例如)

答案 1 :(得分:0)

我不会使用strtok。我会改用strsplit并根据空格拆分它。将strtok来电替换为strsplit。另外,声明一个空的向量...将其称为mean_vec,它将在您读取时存储权重。一旦到达文件的末尾,您就可以计算出之后的平均权重。

因此,尝试这样的事情:

fid = fopen('patwts.dat');
mean_vec = []; %// Add here to store weights per line
if fid == -1
    disp('File open not successful')
else
    while feof(fid) == 0
    % Read one line into a string variable
    aline = fgetl(fid);

    %// Change -  Split up string by spaces
    C = strsplit(aline, ' ');

    %// Change - Print out the information        
    fprintf('%s, %s''s weight is %s lbs\n', C{2}, C{1}, C{3});

    %// Change - Save weight to vector
    mean_vec = [mean_vec; str2double(C{3})];        
    end

    closeresult = fclose(fid);
    if closeresult == 0
        disp('File close successful')
    else
        disp('File close not successful')
    end
end
%// Change - Use mean, not sum
fprintf('The average weight is %f lbs\n', mean(mean_vec));

重要的是该行的每一部分都是字符串。因此,如果您想获得该行末尾的实际数字,则需要将其转换为str2double的数字。一旦我运行了上面的代码,包括我创建了一个名为patwts.dat的文件并将示例数据放入其中的事实,我得到了这个:

George, Darby's weight is 166.2 lbs
Dee, Helen's weight is 143.5 lbs
Lupa, Giovanni's weight is 192.4 lbs
Donovan, Cat's weight is 215.1 lbs
File close successful
The average weight is 179.300000 lbs