MATLAB R2020b读取整个文本文件时如何保留所有换行字符
MATLAB读取全量文本并保留换行符的实现方案
核心问题原因
之前用fscanf读取丢失换行,通常是两个原因导致:
- 调用
fscanf时使用了%s格式符,该格式符默认将换行、空格等空白符作为分隔符跳过,不会读取到返回结果中 - 文本模式打开文件时,Windows平台会自动将原文件的
\r\n换行做转换,无法保留原始换行字节
方案1(效率最高,推荐):二进制模式整块读取
该方案无任何字符转换、无行拆分/循环开销,大文件下性能远高于readlines、fgetl循环,且会原封不动保留所有字符(包括所有换行符、特殊符号),和原文件内容完全一致。
示例代码:
% 以二进制只读模式打开文件,不会触发任何自动字符转换 fid = fopen('目标文件完整路径.txt', 'rb'); % 一次性读取文件全部字节 rawBytes = fread(fid, inf, 'uint8=>uint8'); fclose(fid); % 将字节转成字符向量,若文件为非默认编码可配合native2unicode指定编码 % 例如GBK编码文件可写为:fileContent = native2unicode(rawBytes, 'GBK'); fileContent = char(rawBytes.');
方案2:文本模式下用fscanf读取
如果可以接受Windows下原文件的\r\n换行被自动转换为单个\n,可以用文本模式打开后,指定%c格式符读取全部字符,不会丢失换行:
fid = fopen('目标文件完整路径.txt', 'rt'); % 必须用%c格式,不要用%s fileContent = fscanf(fid, '%c'); fclose(fid);
关于readlines方案的效率说明
readlines本身底层也是整块读取文件后做行拆分,性能不算差,但如果你不需要按行处理文本,额外的数组拆分、拼接步骤属于冗余开销,文件越大性能损耗越明显,不如直接用二进制读取方案效率高。fgetl循环因为是逐行IO,大文件下性能差距会达到数十倍,不推荐使用。
内容的提问来源于stack exchange,提问作者Argyll
相关产品推荐
相关产品推荐

