MATLAB。无法使用FSCANF检测换行。空炭。为什么?

问题描述 投票:0回答:1

我试图逐个字符地读取文本文件中的行,因为我试图读取和修改数据文件,其中最后一列是带有空格的不同长度的注释。但我找不到任何换行符,fscanf返回一个1x1空(How ??)字符而不是例如\r\n。为什么是这样?

fscanf将换行符读入变量tmpChar时,结果如下:

>> tmpChar                                 >> size(tmpChar)

tmpChar =                                  ans =

                                                1     1

>>                                         >>

这是我的测试代码:

fileID = fopen('testfile.txt','r+');
iRow = 1;
tmpChar = fscanf(fileID,'%c',1);
while ~isempty(tmpChar)
    fprintf(['Row ', num2str(iRow), ':', blanks(3)]);
    while ~strcmp(tmpChar,'\r\n') && ~isempty(tmpChar)
        fprintf(num2str(tmpChar));
        tmpChar = fscanf(fileID,'%c',1);
    end
    iRow = iRow + 1;
    tmpChar = fscanf(fileID,'%c',1);
end
fprintf('\n');
fclose(fileID);

上面的结果是:

>>TestScript
Row 1:   First line

Second line

Last line
>>

但我在期待

>>TestScript
Row 1:   First line
Row 2:   Second line
Row 3:   Last line
>>

问题是字符数组不包含任何字符。


我实际使用的文本文件中的一行可能如下所示:

newName.mat | oldName.mat | yyyy-mm-dd HH:mm:ss | randomComment includingWhiteSpaces

我想能够读取这个,将字符串保存在单元格数组中,最后一列中的注释完好无损。


在没有从数据文件的前四列中删除所有空格,使用另一个字符作为分隔符时,我似乎无法找到一种好方法。由于我想确保可读性,这不是一个好的选择。 (newName|oldname|date time|random comment,长名称=>丑!)

如果我使用textscan或任何其他内置函数使用不同于空格的字符作为分隔符,我可以在之后删除单元数组元素中不需要的空格。但是,我宁愿找到一个更有吸引力和更通用的方法来做到这一点。


我已经就同一问题发布了一个问题,但专注于使用textscan [here]。我现在试图逐个字符地读取行并查找换行符。这种方法即使能给予我很好的控制,但仍然没有我想要的那么普遍。但是,我对“缺失”的换行符很感兴趣。为什么我不能用fscanf找到它,即使其他帖子声称你可以?

还请分享其他可行的方法提示。谢谢!

matlab text-files scanf whitespace line-breaks
1个回答
0
投票

我没有直接思考。换行确实是\r\n,但是因为我一次读一个字符就分开了。另外,我正在比较字符串\r\n,而不是字符本身(可以使用sprintf在MATLAB中创建)。因此,当我到达行尾时,我首先阅读\r,然后继续循环,即使我使用strcmpsprintf('\r\n')。输出中有换行的事实让我想到了这一点。

相反,我做了一个常规的字符数组比较,并使用sprintf。那很有效。我给出预期输出的最终代码如下所示:

fileID = fopen('testfile.txt','r+');
iRow = 1;
tmpChar = fscanf(fileID,'%c',1);
while ~isempty(tmpChar)
    if ~any(tmpChar == sprintf('\r\n')) % Because line break will occur twice in a row.
        iRow = iRow + 1;
        fprintf('\n');            
        fprintf(['Row ', num2str(iRow), ':', blanks(3)]);
    end
    while  ~any(tmpChar == sprintf('\r\n'))
        fprintf(num2str(tmpChar));
        tmpChar = fscanf(fileID,'%c',1);
        if isempty(tmpChar)
            break
        end
    end
    tmpChar = fscanf(fileID,'%c',1);
end
fprintf('\n');
fclose(fileID);

我觉得很愚蠢,在发布这个问题之后意识到这一点。但希望这可能会帮助将来没有经验的用MATLAB读取数据文件的人。但是,这个问题的最后一部分仍然很有趣。

© www.soinside.com 2019 - 2024. All rights reserved.