3

我有一个奇怪的问题:

我将文件读入 buf 并尝试在 ssh (Linux) 中运行它。

我的文件包含:

We 
I
a

所以这是我的缓冲区:

在此处输入图像描述

现在我创建一个新文件并将 buf 粘贴到这个新文件中:

FILE*nem_file_name;
nem_file_name= fopen("email1.clear","wb"); //create the file if not exist.
fwrite (buf, sizeof(char), strlen(buf),nem_file_name); //write the new sensored mail to the file. 

在这种情况下,文件:email1.clear 已创建,但它包含以下内容: We Ia

当我将其复制到剪贴板并将其粘贴到该主题时,它被粘贴为:

We 
I
a

为什么我的文件中没有“结束行”?我希望它像我在剪贴板中的一样:/

更新 我尝试通过以下方式手动创建 buf:

char buf[10];
buf[0] = 'W';
buf[1] = 'e';
buf[2] = 32;
buf[3] = 13;
buf[4] = 10;
buf[5] = 'I';
buf[6] = 13;
buf[7] = 10;
buf[8] = 'a';
buf[9] = 0;

(请注意,我没有将文件读入 buf,而是手动进行)

接着:

FILE*nem_file_name;
nem_file_name= fopen("email1.clear","wb"); //create the file if not exist.
fwrite (buf, sizeof(char), strlen(buf),nem_file_name);

并且文件email1.clear是按照我的意愿创建的:

We
I
a

我无法理解!

4

3 回答 3

1

它是一个文本,为什么将它写入二进制文件("wb")?只需使用文本文件,一切都应该没问题(b读取文件和写入文件时从文件打开模式中删除)

于 2013-01-15T14:44:11.060 回答
1

调试器屏幕截图实际上是来自您的 linux 环境吗?还是您在 Windows 调试器上创建它?

这取决于您如何阅读原始文件。如果您使用的是文本模式(rrtfopen通话中),Linux 会在阅读过程中将 CRLF (13,10) 转换为单个 LF (10) 字符。当以二进制模式(如您的代码)将其写入新文件时wb,它将保持单个 LF。

记事本不能将单个 LF 字符作为换行符处理,但是,您的网络浏览器显然可以。

更新
不同操作系统对行尾字符的处理方式不同。在文本模式下打开文件时,在读/写期间处理差异并转换为系统模式/从系统模式转换。在二进制模式下,字节按原样读取和写入,无需转换(fopen 文档)。

这取决于程序应该在哪里运行以及哪些客户端应该读取输出(Linux/Windows)。当您的代码在 linux 上运行时,从 linux 读取文本文件并生成要在 linux 中使用的文本文件,使用文本模式(同样适用于 windows)。如果您需要混合平台,您可能必须自己转换线端。

于 2013-01-15T13:44:38.793 回答
-1

I think strlen(buf) will return the size of buf without the null char that marks end of string. You can try and write to your file like this:

fwrite (buf, sizeof(char), strlen(buf), nem_file_name);
char eos = '\0';
fputc (eos, nem_file_name);

Just my guess. Good luck!

于 2013-01-15T13:07:08.557 回答