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

    [C] lettura da file .txt e struct HELPP

    Ciao a tutti... ho bisogno di una mano per questo problema:

    Ho questo file .txt diviso in colonne da spazi, nalla prima ho il codice vestito(6cifre), nella seconda la marca nella terza il prezzo in euro:

    106077 diesel 78.5
    283211 carrera 54.0
    965789 adidas 64.3
    164300 lacoste 30.0
    140045 allstar 39.9

    IMP: il file txt (chiamato dati_indumenti.txt) puo avere il numero di righe variabili.

    Lo scopo del programma è eseguire una di 3 opzioni:

    - inserimento di un altra riga (non nel txt, ma nella struttura dinamica)
    - modifica di una riga o di uno dei sui dati (non nel txt, ma nella struttura dinamica)
    - eliminazione di una riga (non nel txt, ma nella struttura dinamica)

    Io ho scritto questo codice :

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

    typedef struct
    {
    int codice;
    char marca [20];
    double prezzo;
    }dati_indumenti_t;

    int main (void)
    {

    int numero_righe = 0,
    carattere = 0;
    dati_indumenti_t indumento;
    FILE *file_dati_indumenti;

    if ((file_dati_indumenti = fopen("dati_indumenti.txt","r")) == NULL)
    printf("ERRORE in apertura del file\n");

    else
    {

    while((carattere = fgetc(file_dati_indumenti)) != EOF )
    {
    if(carattere == '\n')
    numero_righe++;
    }
    rewind(file_dati_indumenti);
    fscanf(file_dati_indumenti, "%d %s %lg", &indumento.codice, indumento.marca, &indumento.prezzo);

    while(!feof(file_dati_indumenti))
    {
    printf("%d %s %lg\n",indumento.codice, indumento.marca, indumento.prezzo);
    fscanf(file_dati_indumenti, "%d %s %lf", &indumento.codice, indumento.marca, &indumento.prezzo);
    }

    printf("visualizzo\n%d %s %lg\nnum_righe:%d\n",indumento.codice, indumento.marca, indumento.prezzo, numero_righe);

    fclose(file_dati_indumenti);
    }

    return (0);
    }

    Io eseguendo questo codice riesco a vsualizzare esattamente tutto il file txt stampando i singoli valori che assumono le variabili della struct, ed anche il numero di righe del .txt.

    Il problema è più di uno:
    alla fine io visualizzo i valori della struttura e ovviamente mi stampa solo i 3 valori dell'ultima riga,
    COME DEVO FARE PER MEMORIZZARE TUTTI I DATI IN UNA STRUCT O UNA STRUTTURA DINAMICA E POTER FARE LE 3 OPERAZIONI???

    Es: posso usare una matrice dinamica ??? se si come ?? perchè se fosse statica l'operazione di eliminazione non sarebbe possibile dato che in una matrice i dati nn possono essere eliminati. o mi sbaglio ??

    VI PREGO RISPONDETE,,,,
    10100101011010111100101011101100101011001011

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    il tuo approccio, francamente, non mi pare un granchè.

    Se la cardinalità delle righe è piccola puoi adottare metodi diversi.
    Il più scemo è quello di fare una doppia passata del file di testo.

    nella prima, essenzialmente, leggi una riga alla volta fino a eof, in modo da CONTARE le righe (= gli elementi del tuo vettore).

    Allochi poi un vettore di dimensione opportuna "in un colpo solo".

    Ri-leggi le righe, una alla volta.
    "spezzi" dopo aver letto una riga come stringa con un algoritmo banale tipo...
    te lo metto in pascal sennò fai troppa poca fatica e non impari nulla...
    codice:
    s:= (riga letta da file)
    codicevestito:='';
    i:=0
    while (i<=length(s)) do
     if s[i] in ['0'..9'] then
       codicevestito:=codicevestito+s[i]
    else
    break;
    Questo prende il codicevestito anche se ha lunghezza<>6, in pratica "spazzola" da sinistra a destra tutte le cifre, cercando il primo carattere non numerico.

    Salva questa informazione (il primo carattere non numerico), poi già che ci sei incrementalo finquando non trovi un carattere stringa.

    Poi parti al contrario: dalla fine della stringa verso la testa, cerca tutte le cifre e i ".", creando una variabile stringa che mantiene il prezzo (in euro)
    Poi lo convertirai nel valore a virgola mobile.

    Quando ti arresti hai l'indice finale per la selezione della parte "di mezzo", in pratica un ciclo da "primo carattere" a "ultimo carattere" della marca


  3. #3
    ok ok ok ... questo che tu mi hai spiegato mi pare perfetto, ma il problema non sta nella lettura del txt che farò come tu mi hai detto perchè è meglio della mia, ma nella memorizzazione, cioè devo poter tenere tutti le righe in una matrice dinamica o in una lista e poter eseguire le operazioni,,, non so bene come si fa , ovvero ho delle idee un po confuse!! ma con qualche esempio magari riesco a capire come fare.

    grz ancora
    10100101011010111100101011101100101011001011

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    se la struttura non deve crescere, una volta letta, ti basta - come già segnalato - un vettore o array che dir si voglia, di lunghezza fissa, cosa che in C è fattibile.

    se questa invece deve cambiare dinamicamente, ti serve qualcosa che in C non c'è, ossia una struttura dinamica come un vettore dinamico, una lista, un albero o quello che vuoi.

    In tal caso ti servono funzioni di libreria, oppure scrivertele "a mano"

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.