2016-03-31 6 views
0

Ich habe eine Eingabetextdatei, die 5 Zeilen mit einer Person Vornamen, Nachnamen und ihr Alter nebeneinander, zB: stringWie verwende ich die String-Manipulation, um bestimmte Teile einer Eingabetextdatei zu erfassen?

Mark Cyprus 21 
Elizabeth Monroe 45 
Tom McLaugh 82 
Laura Fairs 3 
Paul Dantas 102 

wie kann ich einfach an ihr Alter aus jeder Zeile mit Manipulation?

+0

einen Blick auf der Antwort meiner nehmen. Denken Sie auch daran, [Antwort] (http://stackoverflow.com/help/accepted-answer) eine Antwort zu akzeptieren, indem Sie auf das Häkchen neben der Antwort klicken. Das gibt Ihnen [Reputation] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) auch: D und gibt auch dem Beantworter gebührende Anerkennung ;-) Ihre Frage Geschichte zeigt, dass Sie niemals eine Antwort akzeptiert haben, was falsch ist. Du nimmst Hilfe von Antworten, dann markierst du sie als akzeptiert, so funktioniert [so]. –

Antwort

2

Sie können sscanf() verwenden (werfen Sie einen Blick auf den Link, es hat ein Beispiel ähnlich Ihrem Bedarf).

Angenommen, jede Textzeile wird in das char-Array line eingelesen.

sscanf(line, "%*s %*s %d", &age); 

Wie Sie Vorname und Nachname nicht interessiert sind, können Sie %*s verwenden, die es ermöglichen wird verbrauchen die Vor- und Nachnamen Literale von der Linie, und Sie werden sie nicht zuordnen müssen irgendeine Variable.

Unten finden Sie einen vollständigen Code für die Aufgabe, vorausgesetzt, Sie haben eine Textdatei mit dem Namen "input.txt", die die von Ihnen in der Frage angegebenen Texte enthält.

#include <stdio.h> 

int main(int argc, char const *argv[]) 
{ 
    freopen("input.txt", "r", stdin); 
    char line[100]; 
    int age; 
    while(fgets(line, 100, stdin) != NULL) 
    { 
     sscanf(line, "%*s %*s %d", &age); 
     printf("%d\n", age); 
    } 
    return 0; 
} 

Ausgang:

21 
45 
82 
3 
102 

Einige Links:

+3

Wenn die Frage interessiert ist - wird "% * s% * s% d" erwähnt, & & age "unterdrückt die Zuweisung der konvertierten Zeichenfolgen, was bedeutet, dass keine' first_name' oder 'last_name' Variablen/Puffer benötigt werden. –

+2

@TonyD war * so * um den * exact * format string zu posten. hochgezogen. – WhozCraig

+0

Großartig! Ich werde es bearbeiten. Danke @Whoz! –

2

In C++, das Tool, das Ihnen helfen kann, ist std::istringstream, in enthalten: #include <sstream>. Es funktioniert wie folgt:

std::ifstream ifs("mydatafile.txt"); 

std::string line; 

while(std::getline(ifs, line)) // read one line from ifs 
{ 
    std::istringstream iss(line); // access line as a stream 

    std::string column1; 
    std::string column2; 
    std::string column3; 

    iss >> column1 >> column2 >> collumn3; // no need to read further 

    // do what you will with column3 
} 

Was std::istringstream tut, ist können Sie einen std::string wie ein Eingangsstrom behandeln wie eine normale Datei.

Die iss >> column1 >> column2 >> collumn3 liest die Spaltendaten in die Variablen.

+0

Ich würde argumentieren, es ist besser zu sagen, wenn (iss >> column1 >> column2 >> column3) ... 'zu überprüfen, die Zeile enthält drei durch Leerzeichen getrennte Strings - gute Gewohnheit zu überprüfen. –

+0

Das ist ein guter Punkt, danke. Ich bin immer irgendwie faul mit diesen Schecks: / –

2

Try this:

#include<iostream> 
#include<string> 
#include<fstream> 

int main() 
{ 
    std::ifstream fin; 
    fin.open("text"); 
    std::string str; 
    while(fin>>str) 
    { 
     fin>>str; 
     fin>>str; 
     std::cout<<str<<"\n"; 
    } 
    fin.close(); 
    return 0; 
} 

Ausgang:

21 
45 
82 
3 
102