Errore elaborazione file!

di il
15 risposte

Errore elaborazione file!

Buonasera,

Scrivo poichè sto riscontrando un problema con questo codice.
In altre parole ho un file .txt con all'interno delle stringhe suddivise per righe tramite con '\0',
Quello che il programma dovrebbe fare è caricare una riga per volta dal file esaminarla ed estrapolare i 25 carattere successivi ai caratteri "V e h".
Una volta trovati quindi i caratteri li copia in un array di char provvisorio e li riscrive in un altro file, denominato "Ole.txt",
ma in coda tramite la funzione fprintf dopo di che deve passare alla riga successiva e ripetere il ciclo.
Ora i problemi che riscontro è:
2) Non so il perchè ma non processa tutte le righe che dovrebbe processa in altre parole nel file ho circa 66000 righe mentre nel file destinazione ne ho circa 44500 e mettendo delle printf per vedere quante ne processava in effetti si interrompe l'esecuzione e non capisco perchè anche se la memoria RAM rimane bassa!

Quindi per intenderci i 2 file txt sono formati nel modo seguente::

FILE SORGENTE
  • 1° Riga: jiofewhbki8uvdfabgyurjrtVh...............sdgrhnyf
    2° Riga: ufbcwuyvbtibouwiuwbwibVh..............scfdsavsadbgn
    etc.
I puntini logicamente rappresentano i 25 caratteri che devo ricopiare nel nuovo file di testo, quindi l'output desiderato dovrebbe essere:

FILE OUTPUT
  • 1° Riga: Vh...............
    2° Riga: Vh..............
    etc.
Per chiarimento vi posto il codice:

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

#define MAXCOL 800
#define MAXNOME 100

main ()
{
   int i, j, riemp;
   char str[MAXNOME];
   char riga[MAXCOL];
   char copia[MAXNOME];
   FILE *f;
   FILE *fp;

   printf("\nDigita il nome del file compreso il tipo (ES:.txt)!\n\nIl file deve essere nominato Senza Spaziature!\n\n");
   scanf("%s", &str);
   f=fopen(str, "r");
   if (f == NULL){
        printf("ERRORE CARICAMENTO FILE! \n");
        system("PAUSE");
   }
   else {
        while ((fgets(riga, MAXCOL, f) != NULL) || (!feof(f))){
            i=0;
			while((riga[i]!='V') || (riga[i+1]!='h'))
                i++;
            riemp=i+26;
            j=0;
            while(i<riemp){
              copia[j]=riga[i];
              j++;
              i++;
            }
            fp=fopen("Ole.txt", "a");
            fprintf(fp, "%s\n", &copia);
            fclose(fp);
        }
   }
   fclose(f);
   return 0;
}
Ringrazio anticipatamente chiunque risponda

15 Risposte

  • Re: Errore elaborazione file!

    Non è che si capisca molto ...

    Come è fatto questo file .txt? Almeno le prime 10 righe ... e come deve essere il file di output ... ?
  • Re: Errore elaborazione file!

    oregon ha scritto:


    Non è che si capisca molto ...

    Come è fatto questo file .txt? Almeno le prime 10 righe ... e come deve essere il file di output ... ?
    Ciao e grazie per la risposta.

    Allora il file txt di partenza è fatto in questo modo:
    • 1° Riga: jiofewhbki8uvdfabgyurjrtVh...............sdgrhnyf
      2° Riga: ufbcwuyvbtibouwiuwbwibVh..............scfdsavsadbgn
      etc.
    I puntini logicamente rappresentano i 25 caratteri che devo ricopiare nel nuovo file di testo, quindi l'output desiderato dovrebbe essere:
    • 1° Riga: Vh...............
      2° Riga: Vh..............
      etc.
    Spero di essere stato chiaro in caso scusami in anticipo e cercherò di spiegarmi meglio!
  • Re: Errore elaborazione file!

    Io la sezione della else la scriverei così
    
    	else {
    		fp = fopen("Ole.txt", "w");
    		while (fgets(riga, MAXCOL, f))
    		{
    		    char *pVh = strstr(riga, "Vh");
       		    if (pVh)  fprintf(fp, "%.27s\n", pVh);
    		}
    		fclose(fp);
    	}
    
  • Re: Errore elaborazione file!

    oregon ha scritto:


    Io la sezione della else la scriverei così
    
    	else {
    		fp = fopen("Ole.txt", "w");
    		while (fgets(riga, MAXCOL, f))
    		{
    		    char *pVh = strstr(riga, "Vh");
       		    if (pVh)  fprintf(fp, "%.27s\n", pVh);
    		}
    		fclose(fp);
    	}
    
    Ciao allora ho appena verificato il codice e mi daà lo stesso identico errore del mio l'unica cosa è che la velocità è notevolmente migliorata.
    non sapevo che la fprintf avesse la possibilità di indicare il numero di caratteri da scrivere su file (%.27), però non riesco a capire cosa fa questa riga:
    char *pVh = strstr(riga, "Vh");
    Scusa la mia ingnoranza|
  • Re: Errore elaborazione file!

    Il codice che ti ho suggerito funziona se nelle righe trova la sequenza Vh

    La funzione strstr cerca Vh nella linea letta

    Se mi fai scaricare il vero file di testo ci do un'occhiata
  • Re: Errore elaborazione file!

    oregon ha scritto:


    Il codice che ti ho suggerito funziona se nelle righe trova la sequenza Vh

    La funzione strstr cerca Vh nella linea letta

    Se mi fai scaricare il vero file di testo ci do un'occhiata
    Eh è complicato purtroppo poichè mi è stato mandato
    Cmq come IDE uso il vecchio DEVC++
  • Re: Errore elaborazione file!

    Ovviamente se il Vh non c'è in tutte le linee non avrai tutte le linee in output
  • Re: Errore elaborazione file!

    NeoX. ha scritto:



    1) Nel while dove esamino i caratteri della stringa non so' il perchè se rimango l'AND non funziona mentre se metto l'OR funziona correttamente!
    
    	i=0;
    	while((riga[i]!='V') && (riga[i+1]!='h')) //qui logicamente andrebbe l'AND ma non funziona se invece inserisco una OR si
    		i++;
    
    Scusa se intervengo anche se ha già risolto oregon, ma ci tengo a farti notare, visto che sei studente e fai ancora in tempo a rimetterti sui binari giusti:

    1) l'esposizione del problema in italiano corretto è importante: già è difficile riuscire a capire cosa non funzioni, non aggiungere rumore di fondo al problema; un giorno ci sarai tu dalla parte di chi deve comprendere, prova a immedesimarti

    2) DEVI fare molti esercizi anche sulla logica di base: che valore assume la condizione ((riga[ i ]!='V') && (riga[i+1]!='h')) quando passi da "Vb" o "ch"?

    3) Per ogni funzione nuova che incontri sul tuo cammino, ad esempio fprintf() o strstr(), DEVI fermarti e leggere TUTTO il reference della funzione (lo trovi online su svariati siti), dall'inizio alla fine, prima di continuare a scrivere il codice.
  • Re: Errore elaborazione file!

    Weierstrass ha scritto:


    NeoX. ha scritto:



    1) Nel while dove esamino i caratteri della stringa non so' il perchè se rimango l'AND non funziona mentre se metto l'OR funziona correttamente!
    
    	i=0;
    	while((riga[i]!='V') && (riga[i+1]!='h')) //qui logicamente andrebbe l'AND ma non funziona se invece inserisco una OR si
    		i++;
    
    Scusa se intervengo anche se ha già risolto oregon, ma ci tengo a farti notare, visto che sei studente e fai ancora in tempo a rimetterti sui binari giusti:

    1) l'esposizione del problema in italiano corretto è importante: già è difficile riuscire a capire cosa non funzioni, non aggiungere rumore di fondo al problema; un giorno ci sarai tu dalla parte di chi deve comprendere, prova a immedesimarti

    2) DEVI fare molti esercizi anche sulla logica di base: che valore assume la condizione ((riga[ i ]!='V') && (riga[i+1]!='h')) quando passi da "Vb" o "ch"?

    3) Per ogni funzione nuova che incontri sul tuo cammino, ad esempio fprintf() o strstr(), DEVI fermarti e leggere TUTTO il reference della funzione (lo trovi online su svariati siti), dall'inizio alla fine, prima di continuare a scrivere il codice.
    Ciao e grazie per i consigli
    1)Si hai ragione diciamo che l'esposizione è stata molto sintetica e ed essenziale ma postando anche il codice credevo che l'insieme delle 2 info andasse ad eliminare tutti i dubbi ma ho sbagliato nella valutazione scusatemi ;

    2)Sulla logica di base diciamo che in termini di algebra di Boole non credo di avere molte difficoltà almeno confrontandomi con alcuni colleghi ed è strano in effetti che non funzioni e si ci va OR poichè io ho messo un NOT avanti;

    3) Si hai pienamente ragione ma era per avere una descrizione sintetica ed essenziale solo ai fini del problema in esame anche se ovviamente ho dato un'occhiata anche alla documentazione online però avere una descrizione da chi la sa usare è certamente diverso ;

    Cmq il problema rimane non so il perchè ma non processa tutte le righe ed è presente in tutte le 66000 righe (verificato con word);
  • Re: Errore elaborazione file!

    NeoX. ha scritto:


    Cmq il problema rimane non so il perchè ma non processa tutte le righe ed è presente in tutte le 66000 righe (verificato con word);
    Avevi detto che avresti inviato il file per controllarlo ma non l'hai fatto ... Inutile dire che il problema rimane se non segui i consigli ...
  • Re: Errore elaborazione file!

    NeoX. ha scritto:


    2)Sulla logica di base diciamo che in termini di algebra di Boole non credo di avere molte difficoltà almeno confrontandomi con alcuni colleghi ed è strano in effetti che non funzioni e si ci va OR poichè io ho messo un NOT avanti;
    Guarda, io non so come sia combinata l'università e cosa vi facciano fare, ma era evidente da subito che while((riga[ i ]!='V') && (riga[i+1]!='h')) fosse sbagliata nel tuo caso, mentre l'espressione corretta era while((riga[ i ]!='V') || (riga[i+1]!='h')) oppure l'equivalente while(! ((riga[ i ]=='V') && (riga[i+1]=='h'))).
    Se non è evidente da subito pure a voi (e ci sta, dato che state imparando), allora è un problema: dovete ripassare bene l'argomento e fare esercizi, anche con le tabelline

    NeoX. ha scritto:


    Cmq il problema rimane non so il perchè ma non processa tutte le righe ed è presente in tutte le 66000 righe (verificato con word);
    E anche qui basta usare la logica: se la tesi è falsa e il procedimento per arrivarci è corretto, allora almeno una delle ipotesi che tu dai per vere è sicuramente falsa. Se non mostri il file allora sta a te scoprire cosa sbagli
  • Re: Errore elaborazione file!

    Guarda, io non so come sia combinata l'università e cosa vi facciano fare, ma era evidente da subito che while((riga[ i ]!='V') && (riga[i+1]!='h')) fosse sbagliata nel tuo caso, mentre l'espressione corretta era while((riga[ i ]!='V') || (riga[i+1]!='h')) oppure l'equivalente while(! ((riga[ i ]=='V') && (riga[i+1]=='h'))).
    Se non è evidente da subito pure a voi (e ci sta, dato che state imparando), allora è un problema: dovete ripassare bene l'argomento e fare esercizi, anche con le tabelline
    Sinceramente mi fa molto piacere che lei sia così competente in materia da evidenziare subito un errore in un codice ma ciò non toglie che non mi sembra corretto ipotizzare allusioni su come sia messa l'università o ciò che si insegna inoltre, giusto per evidenziare una delle ipotesi ma non può essere che abbia provato altre condizioni nel while e che ero convinto di aver postato la condizione == che giustamente funzionava ai miei collleghi con l'AND e a me no poichè provavo il ciclo con la condizione !=. Si è un errore e gliene do atto, è vero ed è palese ma dire cosa ripetere, cosa ci facciano fare all'università e come sia combinata sinceramente è completamente fuori luogo.

    Detto questo per quanto riguarda il file purtroppo non mi è possibile pubblicarlo per un semplice motivo, ovvero non è un file di cui sono il proprietario e chi me lo ha fornito non mi ha dato il consenso per pubblicarlo online (scelta che ahimé non condivido) quindi non posso fare altro che postare ciò che ho svliluppato io ovvero il codice! Mi dispiace
    Se il codice risulta corretto e non ci sono problemi sulla compilazione o sulla gestione dei file allora il problema deve essere il file txt stesso come supponete e devo trovare una soluzione per riuscire a capire perchè!
    Grazie infinite per il disturbo e per l'interessamento ragazzi
  • Re: Errore elaborazione file!

    Mi dispiace che tu non possa postare il file (neanche in pvt), anche perché avevo capito che fosse parte di un esercizio universitario, non di qualcosa di "commerciale/riservato".

    Puoi modificare le poche linee che ti ho dato (che lavorano correttamente) aggiungendo una else per scrivere (a video o su altro file) le linee scartate così ti puoi fare un'idea e trovare una causa del problema.
  • Re: Errore elaborazione file!

    oregon ha scritto:


    Mi dispiace che tu non possa postare il file (neanche in pvt), anche perché avevo capito che fosse parte di un esercizio universitario, non di qualcosa di "commerciale/riservato".

    Puoi modificare le poche linee che ti ho dato (che lavorano correttamente) aggiungendo una else per scrivere (a video o su altro file) le linee scartate così ti puoi fare un'idea e trovare una causa del problema.
    Grazie per la dritta oregon sei gentilissimo, in effetti ho fatto una stampa sulle righe del file .txt originario è ho trovato un'anomalia ovvero alla riga 44500 mi riporta il valore NULL anche se il file non è finito! Quindi effettivamente il problema è il file ora bisogna capire il perchè
Devi accedere o registrarti per scrivere nel forum
15 risposte