Eliminazione prime n righe in file di testo

di il
8 risposte

Eliminazione prime n righe in file di testo

Ciao a tutti! (sono nuovo) mi chiamo Antonio, mi piace pasticciare con vari linguaggi di programmazione....
stavo cercando di scrivere spero un semplice programma in C per leggere un file di testo ed effettuare alcune modifiche aime' mi sono arenato subito.
dovrei eliminare le prima 66 righe da un file di testo ma non ho la piu' pallida idea di come fare!
idee? suggerimenti?
qui il codice (4 righe....)
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>

    main()

    {
        char ch, file_name[35];
        FILE *fp;
        printf("\n");
        system ("cls");
        //textcolor(BLUE); // non funziona
        printf("il mio programma descrizione\n");
        printf("\n");
        printf("Inserire il nome del file da convertire: ");
        gets(file_name);
        fp = fopen(file_name,"r"); // opening file in read mode
        if( fp == NULL )
    {
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }
        
        // eliminazione delle prime 66 linee
           printf("\n");
           printf("sono qui nella sezione elimina 66 righe...\n");
           
        
        fclose(fp);
        return 0;
    }

8 Risposte

  • Re: Eliminazione prime n righe in file di testo

    La cosa più semplice da fare è la seguente:
    1) crei un file temporaneo
    2) fai una prelettura del file fino alla riga n (nel tuo caso 66)
    3) leggi la riga n+1
    4) la scrivi nel file temporaneo
    5) se il file e finito chiudi sia il file temporaneo che il file di lettura e vai al punto 6.
    altrimenti procedi con il passo 3
    6) apri il file temporaneo in lettura
    7) apri il file che vuoi modificare in scrittura
    leggi file temporaneo
    9) scrivi il file che vuoi modificare.
    10) ripeti i punti 8 e 9 finchè il file temporaneo non è finito.
    11) chiudi i due file
    12) cancelli il file temporaneo
    e il gio e fatto!
    con questo sistema modifichi anche, è giustamente, la dimensioni del file.
    se poi vuoi lasciare le dimensioni del file intatte per eventuali modifiche future puoi usare quest'altra serie di punti :
    1) apri file il file da modificare in lettura e scrittura
    2) leggi il file
    3) verifichi che il file non sia finito se è finito vai al punto 8
    4) il record letto e <= n ( n= numero di righe da azzerare)
    se la condizione non si avvera vai al punto 8
    5) modifichi il record con tutti spazi
    6) scrivi il record
    7) vai al punto 2 (prossimo record)
    chiudi il file e termina il programma

    adesso sta a te scegliere quale delle due strategie ti conviene scegliere e mettere in pratica.
    ricordati che entrambi i sistemi funzionano con i file di testo normali per i file ad indice la questione e legermente diversa.
    spero di esserti stato d'aiuto.
    p.s. non ti ho messo il codice perchè da quanto ho capito non sapevi cosa fare e non come farlo!
  • Re: Eliminazione prime n righe in file di testo

    Ciao, grazie per la risposta! e' vero pero' che mi sembra un controsenso leggere a vuoto n righe e poi copiare 10000 righe e piu' in un'altro file! ma cmq, mi sembra la strada piu' semplice!
    (sarebbe molto piu' semplice in assembler...)
    cmq, ho riscritto il codice pero' ci sono due cose che non capisco;
    la prima il ciclo for dovrebbe contare solo 66 volte e invece legge 66*66 volte...
    il printf l'ho messo giusto per debug per capire in mezzo al ciclo for cosa succede....
    e poi alla fine invece di leggermi le restanti righe mi legge solo l'ultima riga...
    in pratica mi legge tutto doppio e mi scrive sul file una sola riga idee??
        #include<stdio.h>
        #include<stdlib.h>
        #include<conio.h>
    
        main()
        {
            char ch, file_name[35];
            FILE *fp;
            int max = 66;
            int i;
            printf("\n");
            system ("cls");
            //textcolor(BLUE); // non funziona
            printf("il mio programma descrizione\n");
            printf("\n");
            printf("Inserire il nome del file da convertire: ");
            gets(file_name);
            fp = fopen(file_name,"r"); // opening file in read mode
            if( fp == NULL )
        {
            perror("Error while opening the file.\n");
            exit(EXIT_FAILURE);
        }
            
               // eliminazione delle prime 66 linee
                  printf("\n");
                    // printf("sono qui nella sezione elimina 66 righe...\n");
                      {
                      char line [ 255 ]; /* or other suitable maximum line size */
                      while ( fgets ( line, sizeof line, fp ) != NULL ) /* read a line */
                      
                           //contatore per 66
                           for(i = 0; i < max;i++)
                           {
                           printf("%d\n",i);
                           fputs ( line, stdout );
                      }
                          // creo nuovo file e scrivo dalla riga 67 fino alle fine del file.
                          fp = fopen("c:/test_w.txt","w");
                          fputs ( line, stdout ); /* write the line */
                          fprintf(fp, line, stdout);
                      }
            
            fclose(fp);
            return 0;
        }
  • Re: Eliminazione prime n righe in file di testo

    Sul fatto che sarebbe più semplice in assembler sono molto daccordo con te infatti io preferisco l'assembler al c++
    comunque cio e dovuto alle strutture del linguaggio.
    i file devono essere aperti in contemporanea sia il file da leggere che il file di comodo,temporaneo.
    poi inizi a leggere il file come se volessi utilizzare il record ma non lo utilizzi e li conti
    una volta che sei arrivato al numero di record che vuoi levare dal successivo inizi a scrivere.
    comunque l'errore che hai fatto stà nella seconda dichiarazione di fp e cioè
    fp = fopen("c:/test_w.txt","w");
    perchè se tu avevi già definito
    fp = fopen(file_name,"r")
    è normale che il programma vada in confusione.
    prova a definire
    fp = fopen(file_name,"r")
    mentre il file da scrivere lo definisci
    fp1 = fopen("c:/test_w.txt","w");
    parlando in maniera assembler utilizzando fp e fp1
    è un poco come se tu avessi 2 handle file.
    mentre come hai fatto tu e come se utilizzassi un solo handle file che vai a modificare ogni volta che utilizzi un file.
  • Re: Eliminazione prime n righe in file di testo

    smalldragon ha scritto:


    sul fatto che sarebbe più semplice in assembler sono molto daccordo con te
    Veramente questa mi sembra una fesseria
  • Re: Eliminazione prime n righe in file di testo

    In assembler basta che ti calcoli lo spostamento da effettuare e ti sposti e poi riversavi il tutto in un altro file e il gioco era fatto.
    poi se volevi cancellavi il file vecchio e rinominavi il nuovo file con il nome del vecchio.
    sotto dos si usava l'int 21 mod ah,42h per lo spostamento
    int 21h mod 41h per cancellare il file
    int 21 mod 56h per rinominare il file
    questo per utilizzare la tecnica che avevo spiegato.
  • Re: Eliminazione prime n righe in file di testo

    L'assembly non è solo e unicamente sotto il DOS.

    Qui lavori in modalità protetta sotto un sistema operativo complesso come Windows.

    Il confronto non regge e comunque i linguaggi come il C (e altri) sono nati proprio per semplificare al programmatore assembly la vita.

    In particolare, la soluzione del problema in questione non dipende dal C o dall'assembly ma dal fatto che l'unico modo per eliminare righe da un file sequenziale è questo. Se lo fai in assembly non ci guadagni proprio nulla.
  • Re: Eliminazione prime n righe in file di testo

    smalldragon ha scritto:


    sul fatto che sarebbe più semplice in assembler sono molto daccordo con te infatti io preferisco l'assembler al c++
    comunque cio e dovuto alle strutture del linguaggio.
    i file devono essere aperti in contemporanea sia il file da leggere che il file di comodo,temporaneo.
    poi inizi a leggere il file come se volessi utilizzare il record ma non lo utilizzi e li conti
    una volta che sei arrivato al numero di record che vuoi levare dal successivo inizi a scrivere.
    comunque l'errore che hai fatto stà nella seconda dichiarazione di fp e cioè
    fp = fopen("c:/test_w.txt","w");
    perchè se tu avevi già definito
    fp = fopen(file_name,"r")
    è normale che il programma vada in confusione.
    prova a definire
    fp = fopen(file_name,"r")
    mentre il file da scrivere lo definisci
    fp1 = fopen("c:/test_w.txt","w");
    parlando in maniera assembler utilizzando fp e fp1
    è un poco come se tu avessi 2 handle file.
    mentre come hai fatto tu e come se utilizzassi un solo handle file che vai a modificare ogni volta che utilizzi un file.
    grzie per la precisazione! provero' al piu' presto non appena tornero' in Italia!
    cmq, per l'assembler si, molto piu' semplice! pero' e' anche vero che l'assembler che conosco e' quello dell'8051!
  • Re: Eliminazione prime n righe in file di testo

    Grazie a tutti per le preziose informazioni! riprendiamo il discorso appena torno in Italia!
    saluti dalla Thailandia
    A.
Devi accedere o registrarti per scrivere nel forum
8 risposte