PDA

Visualizza la versione completa : [C] Concatenare righe di testo prelevate da due file differenti


Ol3iconfini
24-02-2007, 14:13
Salve, ho la seguente domanda.
Dati due file cos composti:
file1:
a b c
d e f

file2:
1 2 3
4 5 6

voglio ottenere un file3:
a b c 1 2 3
d e f 4 5 6

Per ora riesco solo ad allineare parole singole sulla linea, cio:
a 1
b 2
c 3
d 4
e 5
f 6

Il codice scritto questo:

#include <stdio.h>
#include <stdlib.h>


int main ( int argc, char * argv[] )
{
FILE *fda, *fdb, *fdout;
char buffa[64], buffb[64], buffer[128];
int ret;

if ( argc != 4 ) {
printf("usare %s file1 file2 outfile\n",argv[0]);
return 1;
}

fda = fopen (argv[1], "r");
if ( fda == (FILE *) NULL) {
printf("%s assente\n",argv[1]);
return 1;
}
fdb = fopen (argv[2], "r");
if ( fdb == (FILE *) NULL) {
printf("%s assente\n",argv[2]);
return 1;
}

fdout = fopen (argv[3], "a");
while ( 1 )
{
ret = fscanf( fda, "%s", buffa);
if ( ret != 1 )
break;
ret = fscanf( fdb, "%s", buffb);
if ( ret != 1 )
break;
fprintf( fdout ,"%s %s\n", buffa, buffb);
}

fclose ( fda);
fclose ( fdb);
return 0;
}

Come posso modificarlo?

andbin
24-02-2007, 14:29
- Apertura con fopen() dei due file in lettura e del terzo file in scrittura
- Lettura di 1 riga da entrambi i file con fgets()
- Scrittura delle due righe concatenate
- Chiusura dei file.

Presta molta attenzione alla corretta gestione degli errori: come hai scritto il codice, se l'apertura del file2 fallisce, non chiudi il primo file.

Ol3iconfini
24-02-2007, 19:32
Ecco come ho modificato il sorgente:

#include <stdio.h>
#include <stdlib.h>


int main ( int argc, char * argv[] )
{
FILE *fda, *fdb, *fdout;
char *res1, *res2;
char bufa[200];
char bufb[200];

if ( argc != 4 ) {
printf("usare %s file1 file2 outfile\n",argv[0]);
return 1;
}

fda = fopen (argv[1], "r");
if ( fda == NULL) {
perror("Errore in apertura del file");
exit(1);
}
fdb = fopen (argv[2], "r");
if ( fdb == NULL) {
perror("Errore in apertura del file");
exit(1);
}

fdout = fopen (argv[3], "a");
while (1)
{
res1=fgets(bufa, 200, fda);
if( res1==NULL )
break;
res2=fgets(bufb, 200, fdb);
if( res2==NULL )
break;
fprintf( fdout ,"%s%s\n", res1, res2);
}

fclose ( fda);
fclose ( fdb);
fclose ( fdout);
return 0;
}

Il problema che dati i due file:
file1:
a b c

file2:
1 2 3

Ora ottengo:
a b c
1 2 3

d e f
4 5 6

Mentre io desidero:
a b c 1 2 3
d e f 4 5 6

Il problema che fgets() legge fino a \n incluso e quindi lo stampa. Come faccio a leggere la linea fino a \n escluso?? :dh:

oregon
24-02-2007, 20:42
Potresti scrivere



res1=fgets(bufa, 200, fda);
if( res1==NULL ) break;
bufa(strlen(bufa))=0;
res2=fgets(bufb, 200, fdb);
if( res2==NULL ) break;
bufb(strlen(bufb))=0;

andbin
24-02-2007, 21:12
Originariamente inviato da Ol3iconfini
Il problema che fgets() legge fino a \n incluso e quindi lo stampa. Come faccio a leggere la linea fino a \n escluso?? :dh: Io in genere tolgo il \n in questo modo:

char *p;

...
if ((p = strchr (buf, '\n')) != NULL)
*p = '\0';
Non uso cose del tipo:

buf[strlen(buf)] = '\0';

per un motivo molto semplice: se il buffer pi corto della linea (scenario pi che possibile), per leggere l'intera linea ci vogliono pi chiamate a fgets ma solo sull'ultimo buffer ritornato c' il \n. Usando strchr tolgo il \n solo se c'.

Ol3iconfini
25-02-2007, 03:19
Grazie per i suggerimenti e le spiegazioni... :smack: :unz:
Ho risolto cos:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ( int argc, char * argv[] )
{
FILE *fda, *fdb, *fdout;
char *res1, *res2;
char bufa[200];
char bufb[200];
char *p1, *p2;

if ( argc != 4 ) {
printf("usare %s file1 file2 outfile\n",argv[0]);
return 1;
}

fda = fopen (argv[1], "r");
if ( fda == NULL) {
perror("Errore in apertura del file");
exit(1);
}
fdb = fopen (argv[2], "r");
if ( fdb == NULL) {
perror("Errore in apertura del file");
exit(1);
}

fdout = fopen (argv[3], "a");
while (1)
{
res1=fgets(bufa, 200, fda);
if( res1==NULL )
break;
if ((p1 = strchr (bufa, '\n')) != NULL)
*p1 = '\0';

res2=fgets(bufb, 200, fdb);
if( res2==NULL )
break;
if ((p2 = strchr (bufb, '\n')) != NULL)
*p2 = '\0';
fprintf( fdout ,"%s %s\n", res1, res2);
}

fclose ( fda);
fclose ( fdb);
fclose ( fdout);
return 0;
}

Ora lo testo su documenti da 5 MB. Con pi di 2000 linee per file...
Vediamo cosa succede...

:ciauz:

Loading