2012-03-08 20 views
5

actualmente estoy haciendo esto:línea de escritura en un archivo utilizando C

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

pero descubren que al abrir el archivo en un editor de texto consigo

line 1 

line 2 

Si quito el strcat (línea, "\ n"); entonces entiendo

line 1line2 

¿Cómo llego a ser fout

line 1 
line 2 
+0

Simplemente curioso: ¿cómo estás rellenando 'line' antes de agregar la nueva línea? –

+0

Define "Tengo". ¿Cómo estás analizando el contenido del archivo? –

+0

@torrentialcoding En realidad estoy recorriendo un archivo encriptando cada línea y luego escribiendo esa línea en un nuevo archivo. – Dunc

Respuesta

0

puede probar a usar \r en lugar de \n. ¿En qué plataforma estás ejecutando esto, Windows?

2

Cuando se abren los archivos con w (o wt) Windows reemplaza el \n con \r\n.

Para evitar esto, abra el archivo con wb (en lugar de w).

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

A diferencia de muchos otros sistemas operativos, Windows hace una distinción entre el modo binario y de texto, y - confusamente - el tiempo de ejecución de Windows C maneja ambos modos de forma diferente.

+0

Solo para agregar a esto, 'fputs' ya agrega una nueva línea, por lo que no hay necesidad de agregarla explícitamente. –

+2

@Mike Kwan: ​​Gracias por tu comentario. Creo que querías decir 'puts' agrega una nueva línea. AFAICT 'fputs' no. Enlace: http://www.cplusplus.com/reference/clibrary/cstdio/puts/ – bernie

+0

@MikeKwan: ​​No; 'puts()' agrega una nueva línea; 'fputs()' no agrega una nueva línea. Del mismo modo, 'gets()' elimina una nueva línea; 'fgets()' no elimina una nueva línea. –

3

La función puts() agrega una nueva línea a la cadena que se le da para escribir en stdout; la función fputs() no hace eso.

Como no nos ha mostrado todo el código, solo podemos formular una hipótesis acerca de lo que ha hecho. Pero:

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

produciría el resultado que necesita, de dos formas ligeramente diferentes que podrían usarse cada uno dos veces para lograr la consistencia (y su código debe ser consistente — licencia 'elegante variación' para su escritura literatura, no para tu programación).


En un comentario, que dicen:

realidad estoy bucle a través de un archivo cifrado de cada línea y luego escribir esa línea en un nuevo archivo.

¡Oh muchacho! ¿Estás en la base 64 codificando los datos encriptados? Si no, entonces:

  1. Debe incluir b en el modo de fopen() (como en fOut = fopen("fileout.bin", "wb");) ya que los datos encriptados son datos binarios, no de datos de texto. Esto (el b) es seguro tanto para Unix como para Windows, pero es crítico en Windows e inmaterial en Unix.
  2. No debe usar fputs() para escribir los datos; habrá cero bytes ('\0') entre los valores encriptados y fputs() se detendrá en el primero de los que encuentre. Probablemente necesite usar fwrite() en su lugar, diciéndole exactamente cuántos bytes escribir cada vez.
  3. No debe insertar líneas nuevas en ningún lugar; los datos cifrados pueden contener nuevas líneas, pero deben conservarse y no se pueden agregar elementos extraños.
  4. Cuando vuelva a leer este archivo, debe abrirlo como un archivo binario "rb" y leerlo usando fread().

Si codifica en base 64 sus datos encriptados, puede volver a tratar la salida como texto; ese es el punto de la codificación base-64.

+0

Esto tampoco funcionó – Dunc

+2

@Dunc: No podría ser menos útil que simplemente decir" esto no funcionó ". **¿Que pasó? * ¿Qué viste? *** –

Cuestiones relacionadas