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

    [C++] spostare cursore sul file

    Ciao raga, ho un problema, sto facendo un programma Rubrica telefonica.
    Vorrei spostarmi sul File "Rubrica" di 20 byte, ad esempio cosi:
    codice:
    NOME (mi sposto di 20 byte) COGNOME (mi sposto di 20 byte) ecc ecc:
    Prima questo problema lo risolvevo con la funzione "fseek", ma adesso non so come fare:
    codice:
    # include <iostream.h>
    # include <windows.h>
    # include <fstream.h>
    
    using namespace std;
    
    string nome, cogn, numero, mail;
    
    
    int main()
    {
      int scelta;
      cout << "RUBRICA telefonica\n"<<endl;
      while (scelta!=4)
      {
      cout << "1) Inizia Rubrica "<<endl;
      cout << "2) Aggiungi Contatti "<<endl;
      cout << "3) Visualizza contatti "<<endl;
      cout << "4) Esci "<<endl;
      cin >> scelta; 
    
      if (scelta==1)
                    {
                     ofstream write("Prova.txt",ios::out);
                     cout << "Inserisci il nome:"<<endl;
                     cin >> nome; 
                     write << nome;
                     cout << "Inserisci il cognome:"<<endl; 
                     cin >> cogn;
                     write <<cogn;  //qui mi vorrei spostare di 20 byte dall'inizio del file 
                     cout << "Inserisci il numero:"<<endl; 
                     cin >> numero;
                     cout << "Inserisci il l'e-mail:"<<endl; 
                     cin >> mail;        
                     write.close();                    
                    }
                    
      }                                      
      system("PAUSE");  
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Studia i membri dell'oggetto fstream

    http://www.cplusplus.com/reference/iostream/ofstream/

    e in particolare seekp

    P.S. Gli include devono essere

    #include <iostream>
    #include <fstream>

    se il compilatore che usi non e' obsoleto.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ho fatto in questo modo, ma mi scrive sopra:
    codice:
                     ofstream write("Prova.txt",ios::out);
                     write << "NOME";
                     write.seekp (20);
                     write <<"COGNOME";
                     write.seekp (40);
                     write <<"NUMERO";
                     write.seekp (54);
                     write <<"E-MAIL"<<endl;
                     cout << "Inserisci  nome:"<<endl;
                     cin >> nome;
                     write << nome; 
                     cout << "Inserisci  cognome:"<<endl; 
                     cin >> cogn;
                     write.seekp (20);
                     write << cogn; 
                     cout << "Inserisci  numero:"<<endl; 
                     cin >> numero;
                     write.seekp (40);
                     write << numero; 
                     cout << "Inserisci  e-mail:"<<endl; 
                     cin >> mail; 
                     write.seekp (54);
                     write << mail << endl;       
                     write.close();                    
                    }
    volevo far scrivere sul file:
    NOME (spazio) COGNOME (spazio) NUMERO (ecc)
    ale....

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Certo perché se passi un solo argomento al metodo "seekp()", questo viene considerato come la posizione nel file in cui posizionare il cursore di scrittura, quindi è ovvio che anche se passi alla seconda riga i dati in scrittura si sovrascrivono agli altri.

    Leggi attentamente la documentazione relativa al metodo seekp() dal sito che ti ha linkato oregon

    http://www.cplusplus.com/reference/i...eam/seekp.html

    e riuscirai a trovare la soluzione (ti dico che devi passare un altro parametro al metodo in questione).
    every day above ground is a good one

  5. #5
    scusa, ma non riesco a trovare la soluzione.
    Perche' andando a capo nel file, non si dovrebbero sovrascrivere.
    (NOME,COGNOME,ecc ecc) si trovano nella prima riga, mentre i dati da me inseriti, si dovrebbero trovare nella seconda riga.
    Si o no?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Se leggi le prime due righe di quella pagina, vedrai scritto:

    ostream& seekp ( streampos pos );
    ostream& seekp ( streamoff off, ios_base::seekdir dir );

    il che sinifica che il metodo è "sovraccaricato", cioè esistono due definizioni diverse dello stesso metodo (l'overloading è una delle caratteristiche specifiche del C++).

    Quando richiami il metodo seekp() sull'oggetto "write" di classe ofstream, se gli passi un solo argomento, il compilatore "penserà" che vuoi richiamare il primo dei due metodi di cui sopra (quello che appunto accetta un solo parametro); quel metodo non fa altro che posizionare il cursore di scrittura ("put pointer") nella posizione "quello_che_scrivi_tu", che è una posizione "assoluta", cioè relativa all'inizio del file, e non al punto in cui sei arrivato a scrivere.

    Una volta scritta la prima riga, quindi, se richiami il metodo in questo modo

    write.seekp(20);

    posizioni di nuovo il "put pointer" nella posizione "20" dopo l'inizio del file (non dopo la posizione in cui sei arrivato), e quindi andando a scrivere sovrascrivi ciò che hai precedentemente scritto. Per risolvere devi specificare (appunto col secondo argomento) che quella posizione "20" non è da considerare "assoluta", cioè relativa all'inizio del file, ma appunto relativa alla posizione in cui sei arrivato.

    Come fare? Te lo dice la tabella in quella pagina.
    every day above ground is a good one

  7. #7
    ah ok, quindi io dovrei usare la seconda.
    e dovrei usare (ios_base::cur) che è la posizione corrente.
    Vero???

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Esatto.

    Occhio però che se usi "ios_base::cur" dovrai anche modificare i valori di offset che hai scritto, altrimenti i dati della seconda riga non te li troverai allineati con quelli che hai scritto nella prima.

    Cioè una cosa è scrivere

    write.seekp(20);

    che ti sposta il cursore venti posizioni dopo l'inizio dello stream, e un'altra è scrivere

    write.seekp(20, ios_base::cur);

    che ti spiazza il cursore di scrittura di 20 posizioni dopo quella corrente. Le due cose sono equivalenti solo se (appunto) la posizione corrente è proprio l'inizio del file.
    every day above ground is a good one

  9. #9
    okok, ho capito, ma non so' come scrivere bene la sintassi:
    io scrivo
    codice:
                     ofstream write("Prova.txt",ios::out);
                     write << "NOME";
                     write.seekp (20);
                     write <<"COGNOME";
                     write.seekp (40);
                     write <<"NUMERO";
                     write.seekp (54);
                     write <<"E-MAIL"<<endl;
                     cout << "Inserisci  nome:"<<endl;
                     cin >> nome;
                     write.seekp (nome, 0);   //errore
                     cout << "Inserisci  cognome:"<<endl; 
                     cin >> cogn;
                     write.seekp (cogn, 20);    //errore
                     cout << "Inserisci  numero:"<<endl; 
                     cin >> numero;
                     write.seekp (numero, 40);      //errore
                     cout << "Inserisci  e-mail:"<<endl; 
                     cin >> mail; 
                     write.seekp (mail, 54);          //errore
                     write.close();                    
                    }
    Vorrei usare la seconda (di quelle due funzioni che sono in alto nel link che ha postato oregon), usando pero' : ios_base::beg

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Salvatore_91
    Vorrei usare la seconda (di quelle due funzioni che sono in alto nel link che ha postato oregon), usando pero' : ios_base::beg
    Non si era detto ios_base::cur?

    Comunque non è quello il modo di richiamare il metodo... perché gli passi la stringa? Cosa se ne fa?

    Questo è un esempio di come puoi fare:

    codice:
                    ofstream write("prova.txt", ios::out);
                     write << "NOME";
                     write.seekp (20, ios_base::cur);
                     write <<"COGNOME";
                     write.seekp (20, ios_base::cur);
                     write <<"NUMERO";
                     write.seekp (20, ios_base::cur);
                     write <<"E-MAIL"<<endl;
                     cout << "Inserisci  nome:"<<endl;
                     cin >> nome;
                     write << nome; 
                     cout << "Inserisci  cognome:"<<endl; 
                     cin >> cogn;
                     write.seekp (20, ios_base::cur);
                     write << cogn; 
                     cout << "Inserisci  numero:"<<endl; 
                     cin >> numero;
                     write.seekp (20, ios_base::cur);
                     write << numero; 
                     cout << "Inserisci  e-mail:"<<endl; 
                     cin >> mail; 
                     write.seekp (20, ios_base::cur);
                     write << mail << endl;       
                     write.close();
    nota però che in questo modo i dati non ti verranno proprio allineati perché dipende da quanto sono lunghe le stringhe che immetti da tastiera. Per risolvere devi modificare un po' i valori dell'offset a seconda della lunghezza delle stringhe che immetti... prova a ragionarci un po' su.
    every day above ground is a good one

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.