【问题标题】:inserting text to a file (end line isn't entered)将文本插入文件(未输入结束行)
【发布时间】:2012-12-29 14:05:42
【问题描述】:

我有一个奇怪的问题:

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

我的文件包含:

We 
I
a

所以这是我的 buf:

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

看不懂!

【问题讨论】:

  • 您使用什么程序查看文件?你检查过里面的编码了吗?
  • 在十六进制编辑器中查看结果文件。
  • 'a' 后没有新行 (CR-LF),“标准”文本文件以新行结尾。
  • 编码可以在记事本中给出strange results,即它并不总是显示您希望它显示的内容
  • 请看我对这个主题的更新:/

标签: c++ linux file endl


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢,我是从 windows 调试器创建的。我希望它可以在 Linux 上运行。那么我应该在我的程序中改变什么?
  • 我通过 fp=fopen(name_of_file, "rb"); 将文件读入 buf fread (buf, sizeof(char), BUFFER_SIZE, fp);
  • 我尝试通过以下方式读取文件:fp=fopen(name_of_file, "r");并通过以下方式将 buf 输入到新文件中: nem_file_name= fopen(name_of_file,"w");但它不起作用..
  • 首先,我认为fopen()调用中的b对Linux没有影响(见man 3 fopen)。第二:从文件中读取buf的内容,能否在Linux上打印出来?例如,您可以通过以下方式执行此操作:for (size_t i = 0; buf[i]; ++i) { std::cout << i << ": " << unsigned(buf[i]) << std::endl; }
【解决方案2】:

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

【讨论】:

  • b 对 Linux 没有影响(请参阅man 3 fopen)。
  • @FlorianSowade:OP 显示了一个缓冲区,表明他在 Windows 上将文件作为二进制文件读取
【解决方案3】:

我认为 strlen(buf) 将返回 buf 没有标记字符串结尾的空字符的大小。您可以尝试像这样写入文件:

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

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

【讨论】:

  • 没有“EOF char”这样的东西。您可能指的是空字节(字符串终止符),是的,strlen() 不包括在字符数中。
  • 可以查看strlen here的文档
  • 是的,答案不正确,对不起!作为贡献者,我在这里很新。有什么办法可以删除我的答案?我是不是该?谢谢:)
  • 谢谢,但我认为您的新答案也不正确(您看到我对主题的更新了吗?我认为我使用什么编辑器来查看此文件并不重要。两种情况我使用记事本:第一个没有给我想要的结果,第二个给了我想要的结果)。
  • @ÓscarGómezAlcañiz 如果您有其他解决方案,可以单击答案下方的edit 按钮进行修改。如果您想完全删除它,还应该有一个delete 按钮。当您删除时,您仍然可以看到答案并对其进行编辑,但它将从“公众视线”中消失。例如,如果您想在不接受反对票的情况下编辑答案,这将非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2020-07-13
相关资源
最近更新 更多