与正常模式下正确设置的回车符相比,为什么 fprintf 在文本模式下的行为不同?

2023-12-31

下面的问题与其说是一个问题,不如说是一个好奇心。

我绊倒了这个问题 https://stackoverflow.com/q/6536599/2605073,提供了两个似乎相同的不同答案。但他们不是,这让我思考。

想象一个system调用会回显两行:

[~,message] = system( 'echo hello && echo world' );

returns:

hello
world

如果想将这些行写入.txt- 文件并在记事本中打开它,常见的方法是:

fid = fopen([pwd '\helloworld.txt'],'w');
fprintf(fid, '%s\n', message);
fclose(fid);
winopen('helloworld.txt')

返回

hello world

由于记事本显然无法识别换行符\n正确地,解决方案是使用'wt'代替'w'强制执行文本模式,这应该很慢。返回:

hello
world

The fopen 权限的文档 http://www.mathworks.de/de/help/matlab/ref/fopen.html says:

要以文本模式打开文件,请将字母“t”附加到权限上 参数,例如“rt”或“wt+”。

在 Windows® 系统上,在文本模式下:
- 遇到回车符后跟换行符 ('\r\n') 的读取操作会从输入中删除回车符。

-写入操作在任何换行符之前插入回车符 在输出中。

所以根据我的理解,它基本上是:

fprintf(fid, '%s\r\n', message)

但输出再次是:

hello world

还有什么作用'wt'?一个人怎样才能获得与以下行为相同的行为:'w'? 如果这个问题毫无意义且微不足道,我很抱歉,但经过几个令人沮丧的小时后,我只是好奇我错过了什么。


据我了解确实如此

fprintf(fid, '%s', strrep(message, sprintf('\n'), sprintf('\r\n'))

如果你这样做

fprintf(fid, '%s\r\n', message)

您只需在消息的最后添加一个回车符和一个换行符,即“world\n”之后。“hello”和“world”之间的换行符仍然没有回车符。

所以在你的 fprintf 中你的消息是"hello\nworld\n\r\n",它应该在哪里"hello\r\nworld\r\n"

您可以通过以字节为单位读取输出文件来检查这一点,知道\n将是一个10 as uint8 and \r a 13:

>> fid = fopen('test.txt','wt');
>> fprintf(fid, 'hello\nworld\n');
>> fclose(fid);
>> fid = fopen('test.txt','r');
>> bytes = fread(fid, Inf, 'uint8')'

bytes =

   104   101   108   108   111    13    10   119   111   114   108   100    13    10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与正常模式下正确设置的回车符相比,为什么 fprintf 在文本模式下的行为不同? 的相关文章

  • 左填充 printf 带空格

    使用 printf 时如何在字符串左侧填充空格 例如 我想打印 Hello 前面有 40 个空格 另外 我要打印的字符串由多行组成 我需要单独打印每一行吗 编辑 为了明确起见 我希望在每行之前打印 40 个空格 如果您希望在 40 个字符宽
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • scanf %u 负数?

    我努力了scanf u number 我输入了负数 问题是当我printf d number 我得到负数 我认为这会阻止我读取负数 是scanf d number and scanf u number 真的是同一件事吗 或者只是为了可读性
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到
  • Notepad++ - 使函数“可点击”?

    我只是想这可能有用 但我找不到办法 在 Notepad 中 有没有一种方法可以使函数名称 可单击 即使它们成为链接 这样如果您单击它们 它会自动将您带到其定义 最好是跨整个代码库 目前还没有插件提供可直接单击的函数名称 但您可以尝试使用 S
  • PHP 中 file、file_get_contents 和 fopen 之间的区别

    我是 PHP 新手 我不太确定 两者之间有什么区别file file get contents and fopen 函数 什么时候应该使用其中一个而不是另一个 前两个 file http www php net manual en func
  • 轴标注问题

    通过运行我编写的以下 matlab 函数 可以互换图中的 x 轴和 y 轴 谁能告诉我问题出在哪里或者帮我解决它吗 预先感谢您的任何帮助 function axislabeling n x 1 1 n y 1 1 n z zeros n n
  • 像matlab一样在python中连接数组而不知道输出数组的大小

    我正在尝试在 python 中连接数组 类似于 matlab array1 zeros 3 500 array2 ones 3 700 array array1 array2 我在 python 中做了以下操作 array1 np zero
  • 在矩阵中找到叉的最快方法

    定义 A i j 1 是十字的中点 如果元素A i 1 j 1A i 1 j 1A i j 1 1A i j 1 1 这些元素和中点一起形成矩阵 A 中的十字 其中 A 至少是一个 3 3 矩阵 并且i j 0 假设上图是 8 8 矩阵 A
  • 氡变换线检测

    我正在尝试检测灰度图像中的线条 为此 我在 MATLAB 中使用 Radon 变换 我的 m 文件的示例如下所示 我可以使用此代码检测多行 我还使用线条的移位和旋转属性来绘制线条 但是 我不明白在获取rho和theta值后如何获取检测线的起
  • 使用不同的背景颜色保存 MATLAB 图窗

    我想打印一个带有深色背景和白色标签的 MATLAB 图 如果我使用print or saveas命令我不知何故失去了颜色 绘图符号再次变暗 背景变为白色 points rand 100 3 plot3 points 1 points 2 p
  • 可以使用多个 _Generic 创建字符串文字吗?

    有没有办法使用 Generic在同一表达式中多次使用关键字来创建单个字符串文字 我正在寻找的是一种方法 例如生成要传递给的单个格式字符串printf 所有转换说明符都适应正确的类型 写作时this https stackoverflow c
  • awk 的 printf 插入多个变量的正确语法是什么?

    我复制了一些使用 printf 输出字符串在文件中出现的频率的代码 awk BEGIN print The number of times a appears in the file a a counter 1 END printf s n
  • 如何在Matlab中将图像从笛卡尔坐标更改为极坐标?

    我正在尝试将图像的像素从 x y 坐标转换为极坐标 但我遇到了问题 因为我想自己编写该函数 这是我到目前为止所做的代码 function newImage PolarCartRot read and show the image image
  • 基本矩阵错误?

    我试图通过扫描从相机拍摄的两个图像 检测图像中的特征 匹配它们 创建基本矩阵 使用相机内在函数计算基本矩阵 然后分解它以找到旋转和翻译 这是matlab代码 I1 rgb2gray imread 1 png I2 rgb2gray imre
  • matlab中优先级队列的实现方法

    matlab中有没有提供minpriorityqueue功能的库 import java util PriorityQueue import java util public class MyQueue Comparator
  • Matlab下降低图像质量

    问候 我正在尝试找到一种简单的方法来处理图像 以便将其质量从 8 位降低到 3 位 实现这一目标的最简单方法是什么 干杯 如果要线性缩放 只需将每个像素值除以 255 7 即 如果原始图像存储在矩阵 I 中 则让低分辨率图像 J I 255

随机推荐