Getline ignora la prima parola

di il
9 risposte

Getline ignora la prima parola

Ciao a tutti.
Ho un programma che modifica un file .txt immettendoci il testo che si andrà a scrivere nel programma.

Mettendo solo "string testo;" prende solo la prima parola, ignorando completamente tutto quello che c'è dopo la prima spaziatura.

Cercando un po su internet ho trovato che per far "riconoscere" gli spazi si può usare: getline(cin, testo);.

Quest'ultimo funziona, ma ignora completamente la prima parola!!.

Questa è la parte del codice dove mi serve:
 cout<<endl<<"immettere il testo: ";
        cin>>testo;
        getline(cin, testo);

        system("cls");
        cout<<"modifico "<<file_da_modificare<<" da carattere "<<carattere_iniziale<<" a carattere "<<carattere_finale<<" con . "<<testo<<" ."<<endl;
        system("pause");

        testo_b.replace(carattere_iniziale, carattere_finale, testo);

        ofstream write(file_da_modificare.c_str(), ios::trunc);
        write << testo;
"file_da_modificare, carattere_iniziale, carattere_finale" sono altre variabili...

Come faccio a risolvere questo problema?

Grazie in anticipo.

9 Risposte

  • Re: Getline ignora la prima parola

    Ma dici davvero?

    Se lasci la

    cin >> testo;

    è ovvio che ti perdi la prima parola !
  • Re: Getline ignora la prima parola

    Infatti era quello che pensavo...

    peró se levo quel "cin>>testo" non c'è il tempo per scrivere il testo perche passerebbe subito al comando successivo.

    come posso fare?
  • Re: Getline ignora la prima parola

    Che vuoi dire??

    E' la getline che acquisisce il testo da tastiera, è solo quella che deve essere eseguita, cioè così

    cout<<endl<<"immettere il testo: ";
    getline(cin, testo);

    Mi sa che non hai compreso qualcosa.
  • Re: Getline ignora la prima parola

    Eh se lascio:

    cout<<endl<<"immettere il testo: ";
    getline(cin, testo);

    non mi da la possibilità di scrivere...mi passa direttamente al 'system("cls");'
  • Re: Getline ignora la prima parola

    Con il codice che hai mostrato no.

    C'è altro codice PRIMA di questo? Mostralo tutto.
  • Re: Getline ignora la prima parola

    Il problema sta nel 'case 2'
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    string nome_file, file_da_modificare, file_da_leggere;
    string testo;
    int carattere_iniziale, carattere_finale;
    
    
    
    int main()
    {
        FILE * file;
        int scegli_scrivere;
        char scegli;
    
    menu:
        system("cls");
        cout<<"ESERCIZIO: SCRITTURA/LETTURA FILE"<<endl;
        cout<<endl<<"cosa vuoi fare?: scrivere (w), leggere (r), esci (0): ";
        cin>>scegli;
    
        switch(scegli){
    
    case 'w':{ //scrivere
        system("cls");
        cout<<"cosa vuoi fare?: creare (1), modificare (2) ";
        cin>>scegli_scrivere;
    
        switch(scegli_scrivere){
    
        case 1: //creare
            cout<<"nome file: ";
            cin>>nome_file;
            nome_file = nome_file + ".txt";
            ofstream file(nome_file.c_str(), ios::out); //crea il file con il nome scritto dall'utente
    
            if(!file){
                cout<<endl<<"ERRORE";
                goto menu;
            }
    
            system("cls");
            cout<<endl<<"file "<<nome_file<<" creato con successo"<<endl;
            system("pause");
    
            goto menu;
        }
    
        case 2:{ //modificare
    file_inesistente:
            cout<<endl<<"immettere il nome del file (senza enstensione) da modificare: ";
            cin>>file_da_modificare;
            file_da_modificare = file_da_modificare + ".txt";
            ifstream file(file_da_modificare.c_str());
            stringstream buffer;
            buffer << file.rdbuf();
            string testo_b = buffer.str();
    
             if(!file){
                cout<<endl<<"ERRORE: file inesistente";
                system("pause");
                system("cls");
                goto file_inesistente;
            }
    
            cout<<endl<<endl<<"da quale carattere lo vuoi modificare? ";
            cin>>carattere_iniziale;
    
            cout<<endl<<"fino a che carattere vuoi modificare? ";
            cin>>carattere_finale;
    
            cout<<endl<<"immettere il testo: ";
            cin>>testo;
            getline(cin, testo);
    
            system("cls");
            cout<<"modifico "<<file_da_modificare<<" da carattere "<<carattere_iniziale<<" a carattere "<<carattere_finale<<" con . "<<testo<<" ."<<endl;
            system("pause");
    
            testo_b.replace(carattere_iniziale, carattere_finale, testo);
    
            ofstream write(file_da_modificare.c_str(), ios::trunc);
            write << testo;
    
    
            cout<<endl<<file_da_modificare<<" modificato con successo!"<<endl;
            system("pause");
    
            file.close();
            goto menu;
          }
        }
    
        case 'r':{  //leggere
            char riga[100];
    file_inesistente2:
            cout<<"immettere il file (senza estensione) da leggere: ";
            cin>>file_da_leggere;
            file_da_leggere = file_da_leggere + ".txt";
    
            file = fopen(file_da_leggere.c_str(), "r");
    
            if(!file){
                 cout<<endl<<"ERRORE: file inesistente";
                system("cls");
                goto file_inesistente2;
            }
    
            while(!feof(file)){
                fgets(riga, 100, file);
                system("cls");
                cout<<riga<<endl<<endl;
                system("pause");
            }
             goto menu;
        }
    
    
        case 0:
            return 0;
    
    
    
        }
    }
    (se ci sono "errori" tipo che una cosa potevo farla in un modo migliore è perchè ho cominciato da poco ad usare il c++)
  • Re: Getline ignora la prima parola

    Dato che hai altri input prima della getline, devi pulire il buffer con una ignore così
    
    cout<<endl<<"immettere il testo: ";
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    getline(cin, testo);
    
    Per il resto, in C++ non si usano i FILE * ma ofstream e ifstream. Ed evita anche i goto che non sono utili nel tuo caso e poco eleganti.
  • Re: Getline ignora la prima parola

    Ora funziona grazie mille.

    Va bene, vedrò di migliorarlo:
  • Re: Getline ignora la prima parola

    Evita:
    -using namespace std; su un progetto simile, con le sue dimensioni (non obbligatorio ma te lo consiglio)
    -come detto da oregon, le label e goto
    -FILE *, che alla fine non utilizzi localmente
    -miscugli tra array di caratteri statici e std::string
    -variabili globali alla c4zz0

    Usa una indentazione adeguata e spazi tra gli operatori (std::cout << " " non std::cout<<" ")
Devi accedere o registrarti per scrivere nel forum
9 risposte