Linguaggio C: apertura file di testo

di il
13 risposte

Linguaggio C: apertura file di testo

Ciao, sono nuovo sia nel forum che nell'ambiente della programmazione.
Ho da poco iniziato a usare CodeLite su un mac e ho riscontrato un problema quando devo aprire dei file di testo, ovvero non riesco ad aprirli né in modalità di scrittura né in lettura. Se c'è qualcuno che vuole provare a darmi una mano posso mettere i codici sorgente se servono.
Grazie

13 Risposte

  • Re: Linguaggio C: apertura file di testo

    Ciao,

    per prima cosa assicurati di aver letto un po' di documentazione in giro, come ad esempio https://www.cs.bu.edu/teaching/c/file-io/intro

    Poi, se ancora non risolvi, posta il codice e vediamo quali problemi ci sono.
  • Re: Linguaggio C: apertura file di testo

    Ok grazie, ho dato un'occhiata e a livello di istruzioni non dovrebbero esserci errori, anche perché mi ero già confrontato con un amico.
    A questo punto mi viene da chiedere se il problema non sia nell'installazione di CodeLite o nelle impostazioni..
  • Re: Linguaggio C: apertura file di testo

    Se posti il codice intanto guardiamo quello... Per quanto riguarda eventuali problemi di installazione, ti dico per esperienza che molto spesso gli errori sono nel codice, però può sempre essere che il tuo caso sia diverso. Riesci a compilare un semplice "Hello world"?

    Comunque posta il codice, altrimenti non si può dire nulla.
  • Re: Linguaggio C: apertura file di testo

    Sì, la stampa a video di hallo world riesco a farla.

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

    int main()
    {
    FILE*fp;
    char s[64];
    fp=fopen("prova.txt","wt");
    if(fp==NULL)
    {
    printf("Errore\n");
    exit (1);
    }
    scanf("%s",s);
    while(strcmp("fine",s)!=0)
    {
    fprintf(fp,"%s",s);
    scanf("%s",s);
    }
    fclose(fp);
    return 0;
    }

    In questo caso il programma dovrebbe permettermi di scrivere delle frasi sul file prova.txt fino a quando non scrivo "fine". Effettivamente quando faccio run non mi compare il messaggio di errore e posso scrivere quello che voglio finché non metto la stringa fine; ma quando vado ad aprire il file prova.txt con il Texteditor non vi sono le frasi che ho inserito.
  • Re: Linguaggio C: apertura file di testo

    Ho provato il codice su Linux e in effetti funziona... Prova ad inserire
    fflush(fp);
    prima di fclose.
  • Re: Linguaggio C: apertura file di testo

    Ho provato e... Ancora niente da fare.
  • Re: Linguaggio C: apertura file di testo

    emi_ska ha scritto:


    Ho provato e... Ancora niente da fare.
    Strano... come ti ho detto il codice funziona. Purtroppo (o per fortuna) non mi intendo di Mac, quindi non so dirti di più.

    Ultimo consiglio, che credo non serva a nulla: togliere la 't' da "wt" quando apri il file.
  • Re: Linguaggio C: apertura file di testo

    Be ti ringrazio per la disponibilità. Il fatto che a te il codice funzioni è comunque rassicurante, grazie mille.
  • Re: Linguaggio C: apertura file di testo

    Se non ti crea troppo disturbo vorrei chiederti un ultimo favore, potresti controllare se funziona un altro codice un po' più strutturato di quello che ho mandato prima? Si divide in 3 parti: il main.c, un .h ed un altro .c. Per farlo funzionare però dovrei mandarti anche due file .txt. Altrimenti proverò a farlo andare sul pc di qualche amico, grazie.
  • Re: Linguaggio C: apertura file di testo

    Tu manda tutto: io appena posso provo a farlo girare.
  • Re: Linguaggio C: apertura file di testo

    P.S. Hai provato a togliere la 't' da "wt" all'apertura del file?
  • Re: Linguaggio C: apertura file di testo

    Sì ho provato ha togliere la t, ma non cambia nulla; anche perché ho letto che in CodeLite si possono aprire due tipi di file: .txt (file testo, identificati da t) o .dat(file binari, identificati da b) e in pratica mettere o meno la t dopo la modalità di apertura del file è indifferente perché l'istruzione prevede l'apertura di file .txt di default. Forse non sono stato chiarissimo, adesso ti mando il programma
  • Re: Linguaggio C: apertura file di testo

    Allora, il programma vuole che si aprano in lettura due file di testo: voli.txt e prenotazioni.txt.
    voli.txt:
    AA201 BLQ MAD 150 55.80
    AA202 MPX AMS 110 79.00
    AA203 MAD OPO 40 23.00
    AA204 AES BLQ 170 94.67
    AA205 STN CDG 80 47.50
    AA205 BLQ MUN 100 120.20
    BA001 ARN BRU 90 134.99
    BA201 FCO ATH 125 78.00
    CC222 MAD CDG 110 45.14
    CA234 EIN OSL 70 80.20
    FV897 RIX DUB 200 150.32
    CD111 DME BLQ 190 105.30
    GG000 BCN RAK 180 100.23


    prenotazioni.txt:
    AA201 Mark_Riesling A 2 111.6
    AA205 Carl_Donahue R 1 123.5
    CD111 Eric_Carter R 3 821.34
    BA001 Alice_McKenzie A 4 539.96
    AA203 Sarah_Lansbury A 1 23.00
    FV897 Katie_Smith R 2 781.66


    Letti i due file bisogna restituire il numero di righe se non ricordo male. La richiesta era poi di strutturare il programma con date procedure e funzioni.
    Adesso metto il gestioneVoli.h:

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

    #define dimCodVolo 6
    #define dimNome 21
    #define dimCodCitta 4

    typedef struct
    {
    char codiceVolo [dimCodVolo];
    char cittaPartenza [dimCodCitta];
    char cittaArrivo [dimCodCitta];
    int durata;
    float costo;
    } Volo;

    Volo* leggiVoli(char fileName[], int *dim);

    void stampaVolo(Volo v);

    typedef struct
    {
    char codiceVolo [dimCodVolo];
    char nomeCliente [dimNome];
    char tipo;
    int numeroBiglietti;
    float costoTotale;
    } Prenotazione;

    Prenotazione* leggiPrenotazioni(char fileName[], int *dim);

    void stampaPrenotazione(Prenotazione p);




    Adesso metto il gestioneVoli.c:

    #include "gestioneVoli.h"

    Volo* leggiVoli(char fileName[], int *dim)
    {
    int cont, i;
    FILE*fp;
    Volo*result;
    Volo temp;
    fp=fopen(fileName,"r");
    if(fp==NULL)
    {
    printf("Errore nella lettura dell'offerta voli\n");
    exit (1);
    }
    cont=0;
    while (fscanf(fp,"%s %s %s %d %f",temp.codiceVolo,temp.cittaPartenza,temp.cittaArrivo,&(temp.durata),&(temp.costo))==5)
    cont++;
    rewind(fp);
    result=(Volo*)malloc(cont*sizeof(Volo));
    for(i=0;i<cont;i++)
    fscanf(fp,"%s %s %s %d %f",result.codiceVolo,result.cittaPartenza,result.cittaArrivo,&(result.durata),&(result.costo));
    fclose(fp);
    *dim=cont;
    return result;
    }

    void stampaVolo(Volo v)
    {
    printf("\nVolo - Codice Volo: %s\t Codice Partenza: %s\t Codice Arrivo: %s\t Durata: %d\t Costo: %f",v.codiceVolo,v.cittaPartenza,v.cittaArrivo,v.durata,v.costo);
    }

    Prenotazione* leggiPrenotazioni(char fileName[], int *dim)
    {
    int cont, i;
    FILE*fp;
    Prenotazione*result;
    Prenotazione temp;
    fp=fopen(fileName,"r");
    if(fp==NULL)
    {
    printf("Errore nella lettura delle prenotazioni\n");
    exit (1);
    }
    cont=0;
    while(fscanf(fp,"%s %s %c %d %f",temp.codiceVolo,temp.nomeCliente,&(temp.tipo),&(temp.numeroBiglietti),&(temp.costoTotale))==5)
    cont++;
    rewind(fp);
    result=(Prenotazione*)malloc(cont*sizeof(Prenotazione));
    for(i=0;i<cont;i++)
    fscanf(fp,"%s %s %c %d %f",result.codiceVolo,result.nomeCliente,&(result.tipo),&(result.numeroBiglietti),&(result.costoTotale));
    fclose(fp);
    *dim=cont;
    return result;
    }

    void stampaPrenotazione(Prenotazione p)
    {
    printf("\nPrenotazione - Codice Volo: %s\t Nome Cliente: %s\t Tipo: %c\t Numero Biglietti: %d\t Costo Totale: %f", p.codiceVolo,p.nomeCliente,p.tipo,p.numeroBiglietti,p.costoTotale);
    }




    Ed infine il main.c:

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

    int main (void)
    {
    FILE*fp;
    Prenotazione*p;
    Volo*v;
    Volo*voliCercati;
    int i, dimP, dimV, res, dimC;
    //test esercizio 1
    p=leggiPrenotazioni("prenotazioni.txt",&dimP);
    for(i=0;i<dimP;i++)
    stampaPrenotazione(p[i]);
    v=leggiVoli("voli.txt",&dimV);
    for(i=0;i<dimV;i++)
    stampaVolo(v[i]);
    return 0;
    }

    Grazie in anticipo.
Devi accedere o registrarti per scrivere nel forum
13 risposte