将文本插入文件(不输入结束行)

时间:2013-01-15 13:01:38

标签: c++ linux file endl

我有一个奇怪的问题:

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

我的文件包含:

We 
I
a

所以这是我的buf:

enter image description here

现在我创建一个新文件并将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

我无法理解!

3 个答案:

答案 0 :(得分:1)

调试器截图是否真的来自您的Linux环境?或者你是否在Windows调试器上创建它?

这取决于您如何阅读原始文件。我在r调用时使用文本模式(rtfopen),Linux会在阅读过程中将CRLF(13,10)转换为单个LF(10)字符。将其写入二进制模式的新文件(如代码中wb)时,它将保留一个LF。

记事本不能将单个LF字符作为换行符处理,但是,您的webbrowser显然会这样做。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

我认为strlen(buf)将返回buf 的大小而不是标记字符串结尾的null char。您可以尝试写入您的文件:

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

我的猜测。祝你好运!