2012-03-08 39 views
5
文件

目前,我正在做这个:写作线采用C

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

但发现当我在文本编辑器打开该文件,我得到

line 1 

line 2 

如果我删除的strcat (行,“\ n”);然后我得到。

line 1line2 

如何获得FOUT是

line 1 
line 2 
+0

只是好奇:你如何在追加换行符之前填充'line'? – 2012-03-08 16:43:59

+0

定义“我得到”。你如何分析文件内容? – 2012-03-08 16:57:03

+0

@torrentialcoding我实际上是循环遍历每行加密的文件,然后将该行写入新文件。 – Dunc 2012-03-08 16:59:06

回答

0

您可以尝试使用的\r代替\n。你在Windows上运行的是哪个平台?

2

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

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

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

不像许多其他的操作系统中,Windows使二进制和文本模式之间的区别,以及 - 容易混淆 - Windows的C运行时不同的方式处理这两种模式。

+0

只是为了增加这个,'fputs'已经附加了一个新行,所以不需要明确地添加一行。 – 2012-03-08 16:38:56

+2

@Mike Kwan:感谢您的评论。我相信你的意思是'puts'附加一个换行符。 AFAICT'fputs'没有。链接:http://www.cplusplus.com/reference/clibrary/cstdio/puts/ – bernie 2012-03-08 16:49:19

+0

@MikeKwan:不; 'puts()'附加一个换行符; 'fputs()'不会追加换行符。同样,'gets()'移除一个换行符; 'fgets()'不会删除换行符。 – 2012-03-08 16:49:38

3

puts()功能追加一个新行到它被赋予写入stdout字符串; fputs()函数没有这样做。

既然你已经不是我们显示的所有代码,我们只能假设你做了什么。但是:

strcpy(line, "line1"); 
fputs(line, fOut); 
putc('\n', fOut); 
strcpy(line, "line2\n"); 
fputs(line, fOut); 

会产生各自可使用两次来实现的一致性(和你的代码应该是一致的—休假典雅的变化“为您的文学写作,不适合你需要的结果,在两个略有不同的方式你的编程)。


在评论,你说:

实际上我通过文件加密循环的每一行,然后写该行到一个新的文件。

哦,孩子!你是base-64编码加密数据吗?如果没有,那么:

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

如果你是base-64编码你的加密数据,那么你可以回到输出为文本;这就是base-64编码的要点。

+0

这也没有效果 – Dunc 2012-03-08 17:03:22

+2

@Dunc:你只是说“这没有用”而已。 **发生了什么? *你观察到了什么?*** – 2012-03-08 17:21:54