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

    [C++] controllo sui file

    Salve.

    Io ho un file.txt strutturato nella seguente maniera:
    ID (di 5 byte);Flag(1 byte) e altri campi

    esempio:
    1 ;L;altri campi
    2 ;L;altri campi
    3 ;L;altri campi

    Ora io vorrei creare un metodo che mi effettui la cancellazione logica di un record. Ho pensato di far modificare il "Flag" impostandolo non piu' a "L", ma a "X".

    Ho scritto il seguente codice:
    codice:
        void CancellazioneLogica(string NomeFile)
        {
         string id,IDcanc,riga; 
         cout << "Inserisci l'ID del record da cancellare" << endl;
         cin >> IDcanc;
         fstream file(NomeFile.c_str(),ios::in | ios::out);
         while(!file.eof())
         {
           getline(file,id,'\0');      
           if (id==IDcanc)
                         {
                          file <<"X";
                          cout << "Cancellazione Logica effettuata "<< endl;
                         }
           getline(file,riga,'\n');
         }
         file.close();               
        }
    eseguendo questo codice, e scegliendo un ID da cancellare, presente nel file, il programma va in Loop, pero' non mi scrive sul file il carattere "X".

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma perche' non fai un po' di debugging?

    Esegui il codice passo passo e controlla il valore delle variabili ... altrimenti non potrai MAI correggere un programma ...

    Ad esempio, cosa leggi dentro la variabile id ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ho controllato,
    il problema avviene su questa riga qui:
    getline(file,riga,'\n');

    Questa e' come se non venisse eseguita quando id==IDcanc,
    e quindi non esco mai dai ciclo while, e stampo a monitor sempre la scritta:

    Cancellazione Logica effettuata
    Cancellazione Logica effettuata

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Salvatore_91
    Ho controllato,
    il problema avviene su questa riga qui:
    getline(file,riga,'\n');

    Questa e' come se non venisse eseguita quando id==IDcanc,
    Cosa hai controllato, scusa?

    Tu leggi una linea (infatti la funzione si chiama getline) in una variabile.

    Cosa hai all'interno della variabile id dopo che ha letto da file?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    ok, ho riorganizzato il programma nel seguente modo:
    dato che l'id che leggo sul file e' di (5 byte), dimensiono di 5 byte anche quello che inserisco.
    codice:
         string id,IDcanc,riga; 
         cout << "Inserisci l'ID del record da cancellare" << endl;
         cin >> IDcanc;
         IDcanc.resize(5);
         fstream file(NomeFile.c_str(),ios::in | ios::out);
         while(!file.eof())
         {
           getline(file,id,';');
           id.resize(5);
           cout << IDcanc << endl;
           cout << id << endl;     
           if (id==IDcanc)
                         {
                          file <<"X";
                          cout << "Cancellazione Logica effettuata "<< endl;
                         }
           getline(file,riga,'\n');
         }
         file.close();
    Ora scegliendo IDcanc=2.

    il programma mi da la seguente stampa
    2
    2
    Cancellazione Logica effettuata
    2
    2
    Cancellazione Logica effettuata
    2
    2
    Cancellazione Logica effettuata

    loop

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Scusa Salvatore ma penso di non spiegarmi ... e purtroppo mi devo ripetere ...

    Hai controllato, con il debugger, il valore delle variabili utilizzate ?

    La resize non serve a nulla, dato che hai cambiato la getline che adesso legge fino al ;

    Adesso, nella variabile id hai (senza le virgolette)

    "1 "

    e quindi il valore numerico piu' uno spazio.

    Ovviamente la if, per quello spazio, non sarà mai verificata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    allora,
    questa e' una riga del mio file.txt
    codice:
    1,,,,;L;salvatore
    2,,,,;L;marco
    le virgole(,) indicano gli spazi vuoti.

    Con il codice che ti ho postato sopra, secondo il mio ragionamento, il programma dovrebbe funzionare

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ti faro' una domanda semplice ... quali caratteri contiene id quando legge la seconda riga?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    ho controllato, contiene:
    2(e 4 spazi vuoti)

    2,,,,

    (le virgole indicano gli spazi vuoti)

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    E quindi, cosa deduci? Quando confronti un

    2,,,,

    con un semplice

    2

    e' ovvio che sono diversi e la if non viene mai verificata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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