Problema nella cancellazione di un record in un file sequenziale

di palladino.al il
13 risposte
Hofatto questo codice e riesco a fare il primo passaggio di caricamento->lettura->cancellazione ma se lo rieseguo il programma non va… ti posto il codice delle due funzioni:

void caricofilefilm(films FT[]){
 
    FILE *file_filmregistry;
    char filename[] = "film_registry.txt";
    file_filmregistry = fopen("film_registry.txt", "r");
 
 
    FILE *file_filmregistrytemp;
    char filenametemp[] = "film_registrytemp.txt";
    file_filmregistrytemp = fopen(filenametemp, "w");
    int film_count;
            int total_film_count = INITIALIZER;
            total_film_count=count_rows(total_film_count);
    char ID_remove[3+1];
    int ID_remove_int=0;
    char riga[5000];
 
    char* token;
 
    const char delimiters[2]=";";
 
 
    rewind(file_filmregistry);
 
    //leggo il file
    //lettura fino alla fine del file
 
    printf("funziono\n");
    for (int i=0; i<total_film_count; i++){
        fgets(riga, sizeof(riga), file_filmregistry);      //lettura riga per riga
 
        token = strtok (riga, delimiters);
        strcpy(FT[i].id, token);
 
        token = strtok (NULL, delimiters);
        strcpy(FT[i].nome, token);
        token = strtok (NULL, delimiters);
        strcpy(FT[i].trama, token);
        token = strtok (NULL, delimiters);
        strcpy(FT[i].tipologia, token);
        token = strtok (NULL, delimiters);
        strcpy(FT[i].stagioni, token);
        token = strtok (NULL, delimiters);
        strcpy(FT[i].puntate, token);
        token = strtok (NULL, delimiters);
                                strcpy(FT[i].durata, token);
        printf("%s %s %s %s\n", FT[i].id, FT[i].nome, FT[i].trama, FT[i].tipologia);
}
    fclose(file_filmregistry);
    fclose(file_filmregistrytemp);
}
 
 
void eliminarecord(films FT[]){
 
    FILE *file_filmregistry;
    char filename[] = "film_registry.txt";
    file_filmregistry = fopen(filename, "r");
 
 
    FILE *file_filmregistrytemp;
    char filenametemp[] = "film_registrytemp.txt";
    file_filmregistrytemp = fopen(filenametemp, "w");
            int total_film_count = INITIALIZER;
            total_film_count=count_rows(total_film_count);
    char ID_remove[3+1];
        int ID_remove_int=0;
        char riga[5000];
 
        char* token;
 
        const char delimiters[2]=";";
        int i=0;
        int scelta=0;
 
        rewind(file_filmregistry);
 
        printf("dato da visualizzar?:");
        scanf("%d", &scelta);
        printf("%s - %s - %s - %s - %s - %s\n", FT[scelta-1].id, FT[scelta-1].nome, FT[scelta-1].trama, FT[scelta-1].tipologia, FT[scelta-1].stagioni, FT[scelta-1].puntate, FT[scelta-1].durata);
            strcpy(FT[scelta-1].id, " ");
            strcpy(FT[scelta-1].nome, " ");
            strcpy(FT[scelta-1].trama, " ");
            strcpy(FT[scelta-1].tipologia, " ");
            strcpy(FT[scelta-1].stagioni, " ");
            strcpy(FT[scelta-1].puntate, " ");
            strcpy(FT[scelta-1].durata, " ");
            printf("%s - %s - %s - %s - %s - %s\n", FT[scelta-1].id, FT[scelta-1].nome, FT[scelta-1].trama, FT[scelta-1].tipologia, FT[scelta-1].stagioni, FT[scelta-1].puntate, FT[scelta-1].durata);
 
 
            printf("%d", total_film_count);
 
            for(i=0;i<total_film_count;i++){
                if(strcmp(FT[i].id, " ")){
 
                    fprintf(file_filmregistrytemp, "%s;%s;%s;%s;%s;%s\n", FT[i].id, FT[i].nome, FT[i].trama, FT[i].tipologia, FT[i].stagioni, FT[i].puntate, FT[i].durata);
                }
            }
 
 
 
            fclose(file_filmregistry);
            fclose(file_filmregistrytemp);
            remove(filename);
            rename(filenametemp, filename);
    }

13 Risposte

  • Non sei nuovo dei forum e sai benissimo che dire "non va" non significa nulla e non permette di dare risposte.
    ti posto il codice
    A chi stai parlando?
  • oregon ha scritto:


    Non sei nuovo dei forum e sai benissimo che dire "non va" non significa nulla e non permette di dare risposte.
    ti posto il codice
    A chi stai parlando?
    *vi posto il codice
  • Resta il fatto che "non va" non ti aiuta.
  • Io lo eseguo e mi termina con un numero abbastanza grande...
  • Cosa sono

    films
    INITIALIZER
    count_rows

    ?
  • Film è una typedef (film FT[])
    INITIALIZER equivale a 0;
    count_rows e una funzione che conta le righe
  • Non devi solo spiegare ... devi postare questi elementi del sorgente che mancano!
  • 
    int count_rows(int count_rows){
    	FILE *file_filmregistry;
    	int count_row=0; // contatore che conta quante righe ci sono nel file
    	char str[5000]; //Stringa di appoggio
    
    	file_filmregistry = fopen("film_registry.txt", "r");
    	while((fgets(str,5000,file_filmregistry))!=NULL) // fgets usa NULL per vedere se la lettura e' andata a buon fine, quindi a fine di ogni riga
    	count_row++;
    	fclose(file_filmregistry); // chiude il file
    	return count_row;
    }
    
    #define INITIALIZER 0
    
  • Il tempo non è mai tanto e dover chiedere TRE VOLTE la stessa cosa è irritante. Ma è l'ultima volta che te lo chiedo

    Vuoi postare il typedef e la struttura di films ?
  • 
    
    	typedef struct {
    		char id[NAME_LENGH];
    		char nome[NAME_LENGH];
    		char trama[NAME_LENGH];
    		char tipologia[NAME_LENGH];
    		char stagioni[4];
    		char puntate[4];
    		char durata[4];
    	//	char genere[50];
    	}films;
  • E non esiste un main ???
  • #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <time.h>
    #include <stdbool.h>
    #include <string.h>
    #include <unistd.h>
    #include "inizializzazione_sistema.h"
    #include "gestione_menu.h"
    #include "anagrafica_film.h"
    #include "controlli_valori.h"
    
    int main(void) {
    	setvbuf(stdout, NULL, _IONBF, 0);
    #pragma GCC diagnostic ignored "-Wunused-but-set-variable" //permette di evitare bug sull'uso di stringhe
    
    	films anagrafica_film[1000];
    
    	//msg_benvenuto();       //controllo sei i file di i\o sono presenti
    	//controllofile();
    	//inserimentoautomatico(anagrafica_film);
    	caricofilefilm(anagrafica_film);
    	//eliminarecord(anagrafica_film);
    
    	//inserimentoautomatico(anagrafica_film);
    	//inserimentomanuale(anagrafica_film);
    
    
    
    
    
    
    }
  • Questo main funziona ... e quindi?
Devi accedere o registrarti per scrivere nel forum
13 risposte