meerdere regels uit een bestand lezen met behulp van getline ()

Ik probeer in te lezen en vervolgens de inhoud van een tekstbestand met drie regels uit te voeren, als volgt:

Bob Dylan 10 9

JOHN LENNON 8 7

David Bowie 6 5

Voor elke regel wil ik gewoon de lijn uitvoeren, d.w.z. FirstName Lastname Number1 nummer2.

Ik gebruik hiervoor de volgende code:

int num1;
int num2;
string firstName;
string lastName;
string fullName; 
ifstream inFile;
inFile.open("inputFile.txt");
while (getline(inFile, firstName))
    {
        inFile >> firstName >> lastName >> num1 >> num2;
        fullName = firstName + " " + lastName;
        cout << fullName << " " << num1 << " " << num2 << endl;
    }
inFile.close();

Er zijn hier 2 problemen met de uitvoer. Ten eerste wordt de eerste regel niet uitgevoerd, hoewel ik van experimentatie weet dat het het wel lees in. Ten tweede, nadat de laatste 2 lijnen worden gelezen en uitvoer (naar wens), geeft het programma alles in de laatste regel weer, behalve de voornaam (In dit geval is het laatste ding dat het print is Bowie 6 5).

Kan iemand dit eenvoudige voorbeeld gebruiken om uit te leggen hoe de Getline-functie werkt tijdens het lezen in meerdere regels uit een bestand? (Ik weet niet eens of het de beste manier is, maar het is de enige manier waarop ik nog heb). Hier zijn enkele specifieke vragen.

Ten eerste, retourneert de while Loop Conditional Getline (Infile, FirstName) een boolean? Zo ja, hoe kan het waar zijn (d.w.z. hoe kan de while-lus start) als ik nog geen FirstName een waarde heb gegeven? Is het het geval dat het programma de eerste regel leest en als er iets is, dan voert het de while-lus uit, maar beginnend met de tweede regel, omdat het al de eerste gebruikte om te controleren op inhoud?

Ten tweede, als firstName wel een waarde heeft, en als die waarde de voornaam op de eerste regel is (“Bob” in dit geval), waarom wordt de eerste regel dan helemaal niet uitgevoerd? Ik heb mijn hersens pijn gedaan om erachter te komen waar het naartoe ging.

Ten derde, nadat het programma de laatste twee regels heeft ingelezen en weergegeven, gaat het programma naar de volgende regel en ziet niets dan lege plekken, toch? Wat zou dan de waarde van firstName zijn? Zou het leeg zijn, of zou het nog steeds “David” zijn? Als het leeg is, waarom wordt de while-lus dan opnieuw uitgevoerd? Maar als het “David” is, waarom voert het programma die waarde dan niet samen met de andere uit?

Btw, ik werk uit een leerboek (niet voor huiswerk), en het behandelt getline, maar niet voor meerdere regels. Maar dan zijn de oefeningen met meerdere lijnen, dus ik ben een beetje de weg kwijt.


Antwoord 1, autoriteit 100%

Je probeert elke regel twee keer te lezen.

while (getline(inFile, firstName)) // reads the line
    {
        // reads the next line and overwrites firstName!
        inFile >> firstName >> lastName >> num1 >> num2;

Wijzig het in:

while ( inFile >> firstName >> lastName >> num1 >> num2 )
{
    fullName = firstName + " " + lastName;
    cout << fullName << " " << num1 << " " << num2 << endl;
}

EDIT: om uw vragen te beantwoorden:

Hoe werkt getline()?
Leest de hele regel tot het teken ‘\n’ of het opgegeven scheidingsteken. http://www.cplusplus.com/reference/string/string /getline/?kw=getline

Na het lezen van de regel gaat de besturing naar de volgende regel in het bestand.
Het retourneert ook een Booleaanse waarde van TRUE als de leesbewerking succesvol was, anders onwaar.

De extractiemaatschappij sluit standaard op alle witruimtes. Het retourneert ook een Booleaanse waarde die aangeeft of de bewerking succesvol was.

Other episodes