3

下面的问题更多的是好奇而不是问题。

我偶然发现了这个问题,提供了两个似乎相同的不同答案。但他们不是,是什么让我思考。

想象一个system回响两行的电话:

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

返回:

hello
world

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

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

返回

hello world

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

hello
world

fopen 权限的文档说:

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

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

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

所以在我的理解中,它基本上是这样的:

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

但输出再次是:

hello world

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

4

1 回答 1

4

在我的理解中确实如此

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将是10asuint8\ra 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
于 2013-10-10T14:28:09.757 回答