使用C语言将一行写入文件

7

我目前正在做这件事:

FILE *fOut;
fOut = fopen("fileOut.txt", "w");
char line[255];
...
strcat(line, "\n");
fputs(line, fOut);

但是我发现当我在文本编辑器中打开文件时,会出现以下情况

line 1

line 2

如果我移除掉 strcat(line, "\n"); 那么会得到:
line 1line2

如何使fOut成为

line 1
line 2

只是好奇:在添加换行符之前,您是如何填充“line”的? - torrential coding
定义"I get"。你是如何分析文件内容的? - Lightness Races in Orbit
@torrentialcoding 我正在循环遍历文件,加密每一行,然后将该行写入新文件。 - Dunc
3个回答

4
puts()函数会在要写入stdout的字符串后添加换行符;而fputs()函数则不会添加换行符。
由于您没有展示所有的代码,我们只能猜测您所做的事情。但是:
strcpy(line, "line1");
fputs(line, fOut);
putc('\n', fOut);
strcpy(line, "line2\n");
fputs(line, fOut);

以两种略有不同的方式产生所需结果,每种方式都可以使用两次以实现一致性(您的代码应该是一致的 - 将“优雅变化”留给文学写作,而不是编程)。


在评论中,你说:

我实际上正在循环遍历文件,加密每一行然后将该行写入新文件。

哦,天哪!你是否对加密数据进行了base-64编码?如果没有,则:

  1. 您必须在fopen()模式中包含b(例如fOut = fopen("fileout.bin", "wb")),因为加密数据是二进制数据,而不是文本数据。 这个 b 对于Unix和Windows都是安全的,但在Windows上是关键的,在Unix上则是不相关的。
  2. 您不能使用fputs()来写入数据; 在加密值之间会有零字节('\ 0'),并且fputs()将停止在遇到它们中的第一个。 您可能需要改用fwrite(),并告诉它每次要写入多少字节。
  3. 您不能在任何地方插入换行符; 加密数据可能包含换行符,但这些必须保留,不能添加额外的字符。
  4. 当您将此文件读回时,您必须将其作为二进制文件"rb"打开,并使用fread()进行读取。

如果您正在对加密数据进行base-64编码,则可以将输出再次视为文本; 这就是base-64编码的目的。


2
@邓克:你说“这不起作用”比没说还不如。发生了什么?你观察到了什么? - Lightness Races in Orbit

3

当使用w(或wt)打开文件时,Windows会用\r\n替换\n

为了避免这种情况,应该使用wb(而不是w)来打开文件。

...
fOut = fopen("fileOut.txt", "wb");
...

与许多其他操作系统不同,Windows区分二进制模式和文本模式,并且 -- 令人困惑的是 -- Windows C运行时以不同方式处理这两种模式。


补充一下,fputs 已经自动添加了一个新行,所以不需要显式地添加。 - Mike Kwan
2
@Mike Kwan:感谢您的评论。我相信您的意思是puts会附加一个换行符。据我所知,fputs不会。链接:http://www.cplusplus.com/reference/clibrary/cstdio/puts/ - mechanical_meat
@MikeKwan:不是的;puts()会追加一个换行符;fputs()则不会。同样地,gets()会移除一个换行符;而fgets()则不会移除。 - Jonathan Leffler
这并没有解决问题,为了确认一下,我正在使用Windows,但将来会移植到Unix。 - Dunc
@Adam Bernier,Jonathan Leffler,是啊,我在想puts :P - Mike Kwan

0

您可以尝试使用\r代替\n。您正在哪个平台上运行这个程序?是Windows吗?


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