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



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

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

我应该一次一行地将脚本读成字符串,将权重保存到向量中,并以"last,first"的形式打印每个人的名字,后跟权重:

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.

[token, remain] = strtok(aline,' ')将返回第一个标记"Darby"和该行的其余部分。我不认为这是你要找的。我建议使用 strsplit(aline, ' ') ,它将返回一个包含所有标记的单元格,您需要通过执行 for 循环来获取每个"第一个、最后一个、数字"(例如)

我不会使用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 lbsn', 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 lbsn', 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

最新更新