Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Appendere file

    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:
    codice:
    #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?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    - 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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ecco come ho modificato il sorgente:
    codice:
    #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??

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Potresti scrivere

    codice:
      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;

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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??
    Io in genere tolgo il \n in questo modo:
    codice:
    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'è.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Grazie per i suggerimenti e le spiegazioni...
    Ho risolto così:

    codice:
    #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...


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.