我试图逐个字符地读取文本文件中的行,因为我试图读取和修改数据文件,其中最后一列是带有空格的不同长度的注释。但我找不到任何换行符,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找到它,即使其他帖子声称你可以?
还请分享其他可行的方法提示。谢谢!
我没有直接思考。换行确实是\r\n
,但是因为我一次读一个字符就分开了。另外,我正在比较字符串\r\n
,而不是字符本身(可以使用sprintf
在MATLAB中创建)。因此,当我到达行尾时,我首先阅读\r
,然后继续循环,即使我使用strcmp
和sprintf('\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读取数据文件的人。但是,这个问题的最后一部分仍然很有趣。