2012-03-08 13 views
5

Attualmente sto facendo questo:riga di scrittura in un file utilizzando C

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

ma scoprire che quando apro il file in un editor di testo ricevo

line 1 

line 2 

Se rimuovo lo strcat (riga, "\ n"); poi ho capito.

line 1line2 

Come faccio ottengo fOut di essere

line 1 
line 2 
+0

Solo curioso: come si fa a compilare 'line' prima di aggiungere la nuova riga? –

+0

Definire "I get". Come stai analizzando il contenuto del file? –

+0

@torrentialcoding In realtà sto eseguendo il looping di un file crittografando ogni riga e quindi scrivendo quella linea in un nuovo file. – Dunc

risposta

0

Puoi provare a utilizzare \r invece di \n. Su quale piattaforma stai eseguendo questo, Windows?

2

Quando i file vengono aperti con w (o wt) Windows sostituiscecon \r\n.

Per evitare questo, aprire il file con wb (anziché w).

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

A differenza di molti altri sistemi operativi, Windows fa una distinzione tra modalità binaria e il testo, e - confusamente - il runtime di Windows C gestisce entrambe le modalità in modo diverso.

+0

Solo per aggiungere a questo, 'fputs' aggiunge già una nuova riga, quindi non è necessario aggiungerne uno in modo esplicito. –

+2

@ Mike Kwan: ​​Grazie per il tuo commento. Credo che tu intendessi che 'puts' aggiunge una nuova riga. AFAICT 'fputs' no. Link: http://www.cplusplus.com/reference/clibrary/cstdio/puts/ – bernie

+0

@ MikeKwan: ​​No; 'puts()' aggiunge una nuova riga; 'fputs()' non aggiunge una nuova riga. Allo stesso modo, 'gets()' rimuove una nuova riga; 'fgets()' non rimuove una nuova riga. –

3

La funzione puts() aggiunge una nuova riga alla stringa assegnata per scrivere su stdout; la funzione fputs() non lo fa.

Dato che non ci hai mostrato tutto il codice, possiamo solo ipotizzare ciò che hai fatto. Ma:

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

produrrebbe il risultato desiderato, in due modi leggermente diversi che potrebbero essere tutti utilizzati due volte per ottenere la consistenza (e il vostro codice dovrebbe essere coerente — congedo 'elegante variante' per la scrittura della letteratura, non per la tua programmazione).


In un commento, si dice:

realtà sto scorrendo cifrare un file ogni riga e poi scrivere quella linea in un nuovo file.

Oh ragazzo! Sei codificato in base 64 per i dati crittografati? Se no, allora:

  1. È necessario includere b in modalità fopen() (come in fOut = fopen("fileout.bin", "wb");) perché i dati cifrati sono dati binari, non dati di testo. Questo (il b) è sicuro sia per Unix che per Windows, ma è critico su Windows e immateriale su Unix.
  2. Non è necessario utilizzare fputs() per scrivere i dati; ci saranno zero byte ('\0') tra i valori crittografati e fputs() si fermerà al primo di quelli che incontra. Probabilmente dovrai usare lo fwrite(), indicando esattamente quanti byte scrivere ogni volta.
  3. Non è necessario inserire newline ovunque; i dati crittografati potrebbero contenere newline, ma questi devono essere conservati e non è possibile aggiungerne uno estraneo.
  4. Quando si legge di nuovo questo file, è necessario aprirlo come file binario "rb" e leggerlo utilizzando fread().

Se si codifica in base 64 per i dati crittografati, è possibile tornare a trattare l'output come testo; questo è il punto della codifica base-64.

+0

Questo non ha funzionato – Dunc

+2

@Dunc: Non potresti essere meno utile del solo dire" questo non ha funzionato ". **Quello che è successo? * Che cosa hai osservato? *** –

Problemi correlati