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

    [C] il modo migliore di leggere un file linea per linea

    qual' e' ???

    ho provato con fget ma sono costretto ad usare un array statico


    in pratica devo leggere un file linea per linea senza l' utilizzo di un array statico e riscrivere il valore della linea modificato in un altro ... solo che di tutti i tentativi fatti, solo l' fget su array statico mi da qualche risultato ..


    codice:
    ...
    
    #define MAXFILELINE_SIZE   1024	
    
    ... 
    
    int 	line = 0;
    char 	content[MAXFILELINE_SIZE];
    FILE 	*source_file;
    FILE 	*destination_file;
    
    ...
    
    
    while( fgets( content, MAXFILELINE_SIZE, source_file ) != NULL ) {
    
    	fprintf( destination_file,
    		"[%d] %s",
    		++line,
    		content
    	);
    }
    
    ...
    questo va ... ma non usa array dinamico ...


    grazie
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    mi domando se una cosa come questa avrebbe senso ... per funzionare funziona, ma non so quanto sia sensata ..

    codice:
    a = 0;
    				
    while(!feof(source_file))
    {
    	fgetc(source_file);
    	a++;
    }
    
    content = (char *) calloc( 
    		a, 
    		sizeof(char)
    	);
    
    rewind(source_file);
    
    while(fgets(content, a, source_file) != NULL)
    {
    	fprintf(destination_file,
    		"[%d] %s",
    		++line,
    		content
    	);
    
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Puoi fare cosi:

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>


    int main(){
        
    FILE pFile;
        
    pFile fopen ("y.c","r");
        
        while(! 
    feof(pFile)){
            
    //calcolo la posizione corrente
            
    long pos ftell(pFile);
            
    int count 0;
            
    //inizio a leggere finche non ho letto un'intera riga
            
    while(('\n' != (char)getc(pFile)) && (! feof(pFile)))
                
    count++;
            
    //alloco il buffer; count caratteri letti  + 1 per il
            //carattere di fine linea + 1 per il carattere di fine stringa
            
    char *buf = (char *)malloc((count 2) * sizeof(char));
            
    //mi riposto nella posizione da cui devo riprendere a leggere
            
    fseek (pFile,pos,SEEK_SET);
            
    //leggo la riga nel buffer
            
    fgets(bufcount 2pFile);
            
    //stampo la lunghezza della riga e la riga stessa
            
    printf("%d\t%s"countbuf);
            
    //dealloco il buffer
            
    free(buf);
        }
        
    fclose (pFile);
        return 
    0;


    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  4. #4
    intanto ti ringrazio per la risposta

    dando un' occhiata a quello che hai fatto tu mi e' venuto in mente di fare una cosa analoga e che a me sembra il metodo migliore, e per semplicita' e per efficacia.

    testato ed e' ok, ma dimmi se si potrebbe mgliorare:
    codice:
    a = 0;
    char content;
    				
    while(!feof(source_file)) {
    	content = (char)fgetc(source_file);
    	if(content != EOF) {
    		if(content != '\n') {
    			if(a == 0) {
    				fprintf(destination_file,
    					"\n[%d] ",
    					++a
    				);
    			}
    			fprintf(destination_file,
    				"%c",
    				content
    			);
    		}
    		else {
    			fprintf(destination_file,
    				"\n[%d] ",
    				++a
    			);
    		}
    	}
    }
    che mi dici ?
    e' la soluzione piu' indolore ma efficace o c'e' di meglio ?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Bho..dipende che vuoi fare..te parlavi di caricare una riga in un array allocato dinamicamente e quello ti ho fatto io..se per quello che devi fare te va bene il tuo codice usa quello visto che non allochi memoria

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  6. #6
    il fatto e' che non sono affatto esperto, pensavo che sarebbe stato meglio allocare dinamicamente memoria per usare senza problemi l' fgets , invece la memoria posso fare a meno di allocarla, per quello che devo fare, visto che gia' la alloco per un altro array dinamico che si autogenea a seconda dei parametri passati.

    Grazie mille per la disponibilita'
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    Originariamente inviato da andr3a
    il fatto e' che non sono affatto esperto, pensavo che sarebbe stato meglio allocare dinamicamente memoria per usare senza problemi l' fgets , invece la memoria posso fare a meno di allocarla, per quello che devo fare, visto che gia' la alloco per un altro array dinamico che si autogenea a seconda dei parametri passati.

    Grazie mille per la disponibilita'
    ricorda che a differenza dell' fgets fgetc e' molto lento perche' non bufferizza i dati ;
    se sei sotto linux noti da subito la differenza.
    o almeno io l'ho notata sul mio 486
    comunque la cosa migliore e' usare la fread

  8. #8
    Originariamente inviato da kentaromiura
    ricorda che a differenza dell' fgets fgetc e' molto lento perche' non bufferizza i dati ;
    se sei sotto linux noti da subito la differenza.
    o almeno io l'ho notata sul mio 486
    comunque la cosa migliore e' usare la fread
    fread vuole un size_t e se devo fare carattere per carattere, ovvero fread 1 per 1 ... non e' a grandi linee uguale come velocita ?

    comunque grazie per la dritta, pero' fortunatamente in questo caso non mi serve perche' uno dei parametri di valutazione era proprio l' utilizzo della memoria e siccome ho riscritto da zero un programma di ammissione che non era molto ottimizzato e che usava altri metodi, penso e spero che il nuovo, visto che non spreca un byte in piu' , vada bene
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    con la fread puoi leggerti tipo 1.000 caratteri tutti insieme in un buffer, quindi ti scorri il buffer carttere per carattere per trovare i caratteri di fine linea, e man mano scrivi nel file oppure scrivi in un altro array e poi scrivi quest'ultimo nel file

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  10. #10
    Originariamente inviato da andr3a
    fread vuole un size_t e se devo fare carattere per carattere, ovvero fread 1 per 1 ... non e' a grandi linee uguale come velocita ?

    comunque grazie per la dritta, pero' fortunatamente in questo caso non mi serve perche' uno dei parametri di valutazione era proprio l' utilizzo della memoria e siccome ho riscritto da zero un programma di ammissione che non era molto ottimizzato e che usava altri metodi, penso e spero che il nuovo, visto che non spreca un byte in piu' , vada bene
    probabilmente fgetc e' definito come una macro che si ricollega ad una fread (ma dipende dall'implementazione del compilatore) comunque bisognerebbe fare un test disattivando il buffering automatico (se sei sotto linux)
    se hai voglia e tempo per provare usa questa libreria (o copiati la funzione per usare il modo raw)
    http://forum.html.it/forum/showthrea...hreadid=655927
    se sei sotto win non c'e' il buffer automatico e quindi basta un semplice benchmark
    (comunque secondo me,se c'e' qualche differenza e' minima)

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.