Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    c++ visuale borland e file

    Ciao ragazzi javascript:void(0); Stò realizzando un programma per la gestione delle prenotazioni per ristoranti, utilizzando il c++ visuale incluso nell'ambiente della Borland (versione 6) e devo dire che ho qualche problemino... In pratica, utilizzo 4 form, di cui 2 servono: una alla scrittura su file, l'altra alla lettura dal file e all'inserimento delle informazioni in una lista dinamica ordinata per campo nominativo. Dove è il prob? Allora, innanzitutto uso file binary, tramite libreria fstream, e lo apro nella form inserimento come fout.open("lista.dat", ios::binary | ios:ut), prima del metodo Show. Poi, al momento dell'inserimento dei dati, prima mi posiziono utilizzando fout.seekg(i*sizeof(tiporecord)) (i si incrementa dopo ogni inserimento) e poi scrivo utilizzando fout.write((char*)&nomerecord,sizeof(tiporecord)). Ripeto tutte le volte che mi serve, e utilizzando il debugger mi accordo effettivamente che i dati vengono inseriti. Poi al momento della pressione del pulsante exit, viene eseguita la linea di codice fout.close(), per la chiusura. Ora premo il pulsante per aprire la form di visualizzazione, riapro il file ma questa volta utilizzando INSERIMENTO->fout.open("lista.dat", ios::binary | ios::in), mi posizono prima alla fine fout.seekg(0, ios::end) e poi all'inizio fout.seekg(0) (così mi hanno detto a scuola): ora creo un ciclo che si ripete finchè può leggere while(fout.read((char*)&nomerecord,sizeof(tiporeco rd))), e quì iniziano i problemi: per farvi un esempio, se inserisco due record nel file, al momento della lettura, il primo ciclo viene utilizzato per leggere un record che risulta vuoto (tutti i campi NULL, tutti di tipo String), il secondo ciclo legge correttamente il secondo record immesso, poi termina senza lasciare traccia del primo record immesso. Naturalmente, prima di effettuare ogni lettura posiziono il puntatore interno (prima della lettura n° 1 uso fout.seekg(0, ios::end) e fout.seekg(0); prima di ogni lettura successiva fout.seekg(i*sizeof(tiporecord)) ). Io non ho molta esperienza in visuale, quindi magari devo utilizzare degli accorgimenti con il file che non conosco, magari durante il passaggio da una form all'altra. Qualunque aiuto verrà premiato con l'immortalità e l'iscrizione nell'albo degli uomini più importanti del mondo, che attualmente include solo me, Francesco Totti e Michael Jackson . Grazie comunque anche solo della pazienza.

  2. #2

    Re: c++ visuale borland e file

    Originariamente inviato da maxroma91
    utilizzo 4 form, di cui 2 servono: una alla scrittura su file, l'altra alla lettura dal file
    Ma perchè dici di usare i form? Non mischiare la parte visuale con la lettura/scrittura su file.

    fout.write((char*)&nomerecord,sizeof(tiporecord))
    il primo ciclo viene utilizzato per leggere un record che risulta vuoto (tutti i campi NULL, tutti di tipo String)
    Sinceramente non ho letto nel dettaglio la tua descrizione, ma mi viene un dubbio, non è che stai salvando i puntatori alle stringhe anzichè le stringhe stesse? Prova ad aggiungere un campo di tipo intero e verifica se quello viene scritto/letto correttamente.

    HTH,

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    E' una richiesta illeggibile ... VVoVe:
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Faccio un paio di prove

  5. #5
    Citazione:
    Originariamente inviato da maxroma91
    utilizzo 4 form, di cui 2 servono: una alla scrittura su file, l'altra alla lettura dal file


    Ma perchè dici di usare i form? Non mischiare la parte visuale con la lettura/scrittura su file.
    Nono, era per evidenziare il fatto che scrivo e leggo il file in due form separate.

    Citazione: fout.write((char*)&nomerecord,sizeof(tiporecord)) il primo ciclo viene utilizzato per leggere un record che risulta vuoto (tutti i campi NULL, tutti di tipo String) Sinceramente non ho letto nel dettaglio la tua descrizione, ma mi viene un dubbio, non è che stai salvando i puntatori alle stringhe anzichè le stringhe stesse? Prova ad aggiungere un campo di tipo intero e verifica se quello viene scritto/letto correttamente.
    Il puntatore alla stringa? Nella mia struttura, io uso variabili di tipo String (es. String nome)... Il fatto è che l'inserimento risulta errato per il primo record inserito, poi il secondo viene visto normalmente. Mi sono assicurato che ci sia la fout.seekg(0) nel momento eseguire la prima write. Sbaglio qualcosa?

  6. #6
    Originariamente inviato da maxroma91
    Nono, era per evidenziare il fatto che scrivo e leggo il file in due form separate.
    Sì, appunto, perchè invece non usi una classe, esterna ai form, che si occupi della gestione del file? Questo per un miglior design eh, non che cambi il funzionamento.

    Il puntatore alla stringa? Nella mia struttura, io uso variabili di tipo String (es. String nome)
    E quindi? Senza vedere il codice la mia ipotesi è ancora valida. Comunque fai la prova con un campo intero, come ti ho già suggerito. E poi, se apri il file con un editor le vedi le stringhe inserite?

  7. #7
    Citazione: Originariamente inviato da maxroma91 Nono, era per evidenziare il fatto che scrivo e leggo il file in due form separate. Sì, appunto, perchè invece non usi una classe, esterna ai form, che si occupi della gestione del file? Questo per un miglior design eh, non che cambi il funzionamento.
    Io sono un principiante. Mi sapresti dire dove inserire la classe? Nel foglio dove vengo inizializzate le form e dove è presente la riga di codice Application->Run()?

    Citazione: Il puntatore alla stringa? Nella mia struttura, io uso variabili di tipo String (es. String nome) E quindi? Senza vedere il codice la mia ipotesi è ancora valida. Comunque fai la prova con un campo intero, come ti ho già suggerito. E poi, se apri il file con un editor le vedi le stringhe inserite?
    Allora, se apro con il blocco note, vedo i soliti quadratini, separati da spazi, senza traccia dei miei dati; però il file pesa 28 byte, cioè il giusto peso della mia struttura...

    PS. Grazie del tempo che mi stai dedicando, appena posso ti posto la parte di codice interessata.

  8. #8
    Originariamente inviato da maxroma91
    Mi sapresti dire dove inserire la classe? Nel foglio dove vengo inizializzate le form e dove è presente la riga di codice Application->Run()?
    Crei un nuovo file e la piazzi lì (non è obbligatorio eh).

    Allora, se apro con il blocco note, vedo i soliti quadratini, separati da spazi, senza traccia dei miei dati;
    Appunto, quindi non stai salvando le stringhe, ma i puntatori.

    però il file pesa 28 byte, cioè il giusto peso della mia struttura...
    Cioè la dimensione di 7 puntatori (da 4 byte).

    Hai fatto la prova con un campo intero (e tre)?

  9. #9
    La mia struttura è così composta:

    struct CLIENTE
    {
    String data;
    String ora;
    String nominativo;
    int coperti;
    String location;
    String dettagli;
    String recapito;
    };

    CLIENTE prova;

    le riempio con una semplice assegnazione, (es, prova.data="pippo"). Così quindi stò utilizzando solo il puntatore?

    Adesso ti scrivo il pezzo di inserimento all'interno del file

    p.data=data;
    int size=sizeof(CLIENTE);
    p.ora=ora;
    p.nominativo=nome;
    p.coperti=coperti;
    p.location=location;
    p.dettagli=dettagli;
    p.recapito=recapito;
    if(!fout.is_open())
    fout.open("lista.dat",ios::binary|ios:ut);
    fout.seekp(i*size);
    fout.write((char*)&p,sizeof(CLIENTE));
    i++;
    fout.close()

    tutto questo è inserito in una funzione chiamata da un pulsante.

  10. #10
    Originariamente inviato da maxroma91
    le riempio con una semplice assegnazione, (es, prova.data="pippo"). Così quindi stò utilizzando solo il puntatore?
    Così va bene, il problema è che quando fai:

    fout.write((char*)&p,sizeof(CLIENTE));
    vai a scrivere i puntatori per i campi String e non i byte che compongono le stringhe. Immagino che il campo "coperti", invece, venga scritto/letto correttamente.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.