我目前正在做这件事:
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
我目前正在做这件事:
FILE *fOut;
fOut = fopen("fileOut.txt", "w");
char line[255];
...
strcat(line, "\n");
fputs(line, fOut);
但是我发现当我在文本编辑器中打开文件时,会出现以下情况
line 1
line 2
line 1line2
如何使fOut成为
line 1
line 2
puts()
函数会在要写入stdout
的字符串后添加换行符;而fputs()
函数则不会添加换行符。strcpy(line, "line1");
fputs(line, fOut);
putc('\n', fOut);
strcpy(line, "line2\n");
fputs(line, fOut);
以两种略有不同的方式产生所需结果,每种方式都可以使用两次以实现一致性(您的代码应该是一致的 - 将“优雅变化”留给文学写作,而不是编程)。
在评论中,你说:
我实际上正在循环遍历文件,加密每一行然后将该行写入新文件。
哦,天哪!你是否对加密数据进行了base-64编码?如果没有,则:
fopen()
模式中包含b
(例如fOut = fopen("fileout.bin", "wb")
),因为加密数据是二进制数据,而不是文本数据。 这个 b 对于Unix和Windows都是安全的,但在Windows上是关键的,在Unix上则是不相关的。fputs()
来写入数据; 在加密值之间会有零字节('\ 0'
),并且fputs()
将停止在遇到它们中的第一个。 您可能需要改用fwrite()
,并告诉它每次要写入多少字节。"rb"
打开,并使用fread()
进行读取。如果您正在对加密数据进行base-64编码,则可以将输出再次视为文本; 这就是base-64编码的目的。
当使用w
(或wt
)打开文件时,Windows会用\r\n
替换\n
。
为了避免这种情况,应该使用wb
(而不是w
)来打开文件。
...
fOut = fopen("fileOut.txt", "wb");
...
与许多其他操作系统不同,Windows区分二进制模式和文本模式,并且 -- 令人困惑的是 -- Windows C运行时以不同方式处理这两种模式。
fputs
已经自动添加了一个新行,所以不需要显式地添加。 - Mike Kwanputs
会附加一个换行符。据我所知,fputs
不会。链接:http://www.cplusplus.com/reference/clibrary/cstdio/puts/ - mechanical_meatputs()
会追加一个换行符;fputs()
则不会。同样地,gets()
会移除一个换行符;而fgets()
则不会移除。 - Jonathan Lefflerputs
:P - Mike Kwan您可以尝试使用\r
代替\n
。您正在哪个平台上运行这个程序?是Windows吗?