向文件中插入文本(未输入结束行)

3

我有一个奇怪的问题:

我将一个文件读入缓存,然后尝试在ssh(Linux)中运行它。

我的文件包含:

We 
I
a

这是我的缓冲区:

enter image description here

现在我创建了一个新文件,并将缓冲区粘贴到这个新文件中:

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

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

更新 我试图手动创建缓冲区:

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;

(请注意,我没有将文件读入缓冲区,而是手动执行此操作)
然后:
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

我无法理解它!


你用什么程序查看文件?你检查过它的编码吗? - default
在十六进制编辑器中查看结果文件。 - Kerrek SB
1
在字母'a'后面,你没有一个新行(CR-LF),“标准”的文本文件都以一个新行结束。 - Marc Glisse
编码可以在记事本中产生奇怪的结果,即它不总是显示您想要显示的内容。 - default
请查看我对此主题的更新:/ - Maor Cohen
显示剩余4条评论
3个回答

1

调试器截图是来自你的Linux环境吗?还是你在Windows调试器上创建的?

这取决于您如何读取原始文件。如果您使用文本模式(在fopen调用中使用rrt),Linux将在读取期间将CRLF(13,10)转换为单个LF(10)字符。当将其写入新文件时,以二进制模式(如您的代码中的wb)保持单个LF。

Notepad无法处理单个LF字符作为换行符,但是您的Web浏览器显然可以。

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

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


谢谢,我是用Windows调试器创建的。我想让它在Linux上运行。那么我应该在我的程序中改变什么? - Maor Cohen
我通过以下方式将文件读入buf中:fp=fopen(name_of_file, "rb"); fread (buf, sizeof(char), BUFFER_SIZE, fp); - Maor Cohen
我尝试通过以下方式读取文件:fp=fopen(name_of_file, "r"); 并将缓冲区输入到新文件中:new_file_name= fopen(name_of_file,"w"); 但是它不起作用。 - Maor Cohen
首先,我认为在Linux中fopen()调用中的b没有任何影响(参见man 3 fopen)。其次:在从文件中读取buf后,您能否在Linux上打印其内容?例如,您可以通过以下方式完成:for (size_t i = 0; buf[i]; ++i) { std::cout << i << ": " << unsigned(buf[i]) << std::endl; } - Florian Sowade

1

这是一段文本,为什么要将它写入二进制文件("wb")?只需使用文本文件即可,一切都应该正常(在读取文件和写入文件时从文件打开模式中删除b)。


b 在 Linux 上没有影响(参见 man 3 fopen)。 - Florian Sowade
@FlorianSowade:OP展示了一个缓冲区,表明他在Windows上以二进制方式读取文件。 - Andriy Tylychko

-1

我认为 strlen(buf) 会返回 buf 的大小但不包括标记字符串结尾的 null 字符。您可以尝试像这样向您的文件写入:

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

这只是我的猜测。祝你好运!


1
没有所谓的“EOF字符”。你可能指的是空字节(字符串终止符),是的,strlen()不会将其计入字符计数。 - DevSolar
1
您可以在此处查看strlen的文档:http://en.cppreference.com/w/cpp/string/byte/strlen - default
谢谢你,但我认为你的新答案也不正确(你看到我对主题的更新了吗?我认为使用什么编辑器查看此文件并不重要。在两种情况下,我都使用记事本:第一种情况没有给我想要的结果,而第二种情况则给了我想要的结果)。 - Maor Cohen
@ÓscarGómezAlcañiz 如果您有其他解决方案,可以单击您的答案下面的“编辑”按钮进行修改。如果您想完全删除它,还应该有一个“删除”按钮。当您删除时,仍然可以看到答案并进行编辑,但它将从“公众视野”中消失。如果您想在不受负面评价的情况下编辑答案,这非常有用。 - default
谢谢@Default,我编辑了答案,让它说的更好些 :) - Óscar Gómez Alcañiz
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接