Dubbio tokanization

Potete dirmi come mai utilizzando questo codice

#include <iostream>
using namespace std;
int main(){
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        string nome, cognome, etas;
        getline(cin,nome,';'); //leggo le tre variabili dallo stream usando come separatore ;
        getline(cin,cognome,';');
        getline(cin,etas,';');
        int eta = stoi(etas); //converto etas in int
        cout << nome << " " << cognome << " " << eta << endl;
}

Si ripete all’infinito la fase di input?

Ho aggiunto:

#include <string>

e ha funzionato, senza la #include sulla mia macchina non compilava.

Ha me mi da questo errore: terminate called after throwing an instance of ‘std::invalid_argument’
what(): stoi
Aborted (core dumped)
Sto utilizzando mouse pad di linux

prova a guardare la documentazione:

stoi - C++ Reference

o prova a scrivere

Uso vs 2019 su macchina con SO windows10 e funziona anche aggiungendo l’argomento nullptr dentro la stoi.

Ho provato quello che mi consigli ma sempre lo stesso errore mi da, vs 2019 non c’e l’ho, vorrei provare a farlo funzionare su mouse pad

Il file “input.txt” cosa contiene?

Niente, è un inizio dove si creano questi due file, ma non servono in questo caso, togliendoli l’errore scompare ma il problema di prima rimane: input infinito

Ma il file “input.txt” non viene creato dal nostro programma.
Quando il programma viene mandato in esecuzione quel file deve già esistere e contenere qualcosa che verrà letto (apertura del file in “r” cioè read) con le getline()

Come ho detto prima, sono un aggiunta in più da me(le righe che ho formattato), però se tolte l’errore non l’ho da più. Non ho detto che il file è creato dal programma.

freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);

Ho fatto un altro programma con stoi e mi sta dando sempre lo stesso errore, anche aggiungendo nullptr

terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoi
Aborted (core dumped)

Ma quello che voglio dire è:
hai creato, con un normale editor di testo, un file nel quale hai scritto qualcosa tipo:
Gianni; Rossi;25;
e poi l’hai salvato dandogli come nome “input.txrt” , mettendolo nella cartella nel quale poi il tuo programma cercherà di aprirlo in lettura con:

Hai fatto tutto questo? Altrimenti senza la freopen leggi da tastiera

No. Non so bene come funziona il freopen, anche se penso che sia simile alla funzionalità della libreria fstream. Nel mio codice, non interessandomi di queste righe le ho tolte, ora il codice che crea il problema è questo:

#include <iostream>
#include <string>
using namespace std;
int main()
{
        string nome, cognome, etas;
        getline(cin,nome,';'); //leggo le tre variabili dallo stream usando come separatore ;
        getline(cin,cognome,';');
        getline(cin,etas,';');
        int eta = stoi(etas,nullptr,10); //converto etas in int
        cout << nome << " " << cognome << " " << eta << endl;
}

Deduco che il file di input sia stato creato per inserire l’input ricavato dalle getline, ma non importa questo. Quello che è strano è che togliendo i freopen non mi da più l’errore di stoi ma mi entra nel problema iniziale, cioè che si ripete all’infinito la fase di input. Grazie comunque che mi stai aiutando

Ho provato sulla mia macchina questa tua ultima versione e funziona a patto di inserire da tastiera una unica riga di testo con i tre campi separati da 3 ‘;’ ovvero tipo: paolo; rossi; 55;.
Il problema potrebbe essere che poi il programma termina chiude e non si vede l’output prodotto dalla cout, Potresti inserire un: return 0; dopo la cout e mettere un breakpoint li, oppure lasciare

e vedere cosa ha scritto nel file output.txt (con un qualunque text editor)

Ah ok ora mi funziona. Dovevo digitare la variabile più il ; alla fine, non avevo capito come funziona il getline. Grazie del tuo aiuto. Ora vedo se nell’altro esercizio che non ti ho fatto vedere risolvo la questione dello stoi, sennò chiederò di nuovo aiuto. Grazie di tutto.