2016-11-14 2 views
0

So habe ich Probleme beim Speichern der Informationen nach dem Parsen einer Textdatei. Die Textdatei hat so etwas wie dieses im InnerenVerwenden von Trennzeichen zum Analysieren einer Adresse Nach 'Street; Stadt; Zustand; Land 'und Speichern jedes Bereichs in einer anderen Variablen

1234 Main St; Oakland; CA; USA 
2134 1st St; San Fransico; CA; USA 
etc. etc. 

Im Moment habe ich diese Variablen, die ich die Informationen der Adresse verwenden, werde speichern

vector <string> addressInfo; 
vector <string> street; 
vector <string> city; 
vector <string> state; 
vector <string> country; 

Ich bin auch derzeit in der Lage, das Programm zu bekommen das ";" aus der Datei und speichert alle Daten in einem einzigen Vektor getline

while(read == true) 
{ 
    getline(in, line, ';'); 
    if (in.fail()) 
    { 
     read = false; 
    } 
    else 
    { 
     addressInfo.push_back(line); 
    } 
} 

Wenn ich eine for-Schleife zur Ausgabe tun, was im Inneren des Address-Vektors ist, bekomme ich

1234 Main St 
Oakland 
CA 
USA 
etc. etc. 

ich, dass ich weiß, könnte Stringstream verwenden, aber ich weiß nicht, wie man jede Zeile vom Vektor in die verschiedenen Variablen speichert.

+0

Gibt es immer im selben Format: 'Hausnummer; Stadt; Zustand; Land? Gibt es eine Ausnahme? – Danh

+0

http://stackoverflow.com/questions/236129/split-a-string-in-c – Ignat

+0

Alle Zeilen in der Datei sind in diesem Format. – SVINT

Antwort

0

Ich glaube nicht, dass Sie Ihre Daten wie folgt gespeichert werden sollen:

vector <string> addressInfo; 
vector <string> street; 
vector <string> city; 
vector <string> state; 
vector <string> country; 

Ich denke, es sollte wie folgt aussehen:

struct address_info { 
    std::string street; 
    std::string city; 
    std::string state; 
    std::string country; 
    address_info() {} 

    // from C++11, I prefer below style 
    //address_info() = default; 
    address_info(std::string street_, std::string city_, std::string state_, std::string country_) 
    : street(street_), city(city_), state(state_), country(country_) 
    {} 
}; 
int main() 
{ 
    std::vector<address_info> list; 
    // Let's assume that you know how to get this 
    std::string line = "1234 Main St; Oakland; CA; USA"; 
    std::string street; 
    std::string city; 
    std::string state; 
    std::string country; 
    std::istringstream iss(line); 
    // remember to trim the string, I don't put it here 
    getline(iss, street, ';'); 
    getline(iss, city, ';'); 
    getline(iss, state, ';'); 
    getline(iss, country, ';'); 

    // This is the C++11 code to add to vector 
    //list.emplace_back(street, city, state, country); 

    // Pre-C++11 style 
    list.push_back(address_info(street, city, state, country)); 
} 

Wie auch immer, können Sie für eine CSV-Bibliothek gehen suchen.

+0

Danke Danh! Dieser hat viel geholfen! – SVINT

0

Hier ist eine C++ 14 Version mit tokenisierten Algorithmus (ziemlich ähnlich zu STL-Stil). Es ist C++ 14, nur weil ich ein generisches Lambda verwende, aber auch C++ 11-kompatibel gemacht werden kann.

Ich gehe davon aus, dass Sie einen Vektor für jedes Feld nach SOA (Struct of Arrays) Prinzip verwenden. Wenn nicht, würde ich sie lieber in einer Struktur gruppieren.

HINWEIS: Ich habe einige Fehlerüberprüfung übersprungen, die Sie nicht sollten.

0

Push_back die Namen/Zeichenfolge in den jeweiligen Vektor. newline ist ein Standardtrennzeichen für getline.

string street_name; 
string city_name; 
string state_name; 
string country_name; 

while(getline(cin, street_name, ';') && getline(cin, city_name, ';') && 
     getline(cin, state_name, ';') && getline(cin, country_name)) 
{ 
    street.push_back(street_name); 
    city.push_back(city_name); 
    state.push_back(state_name); 
    country.push_back(country_name);  
} 
Verwandte Themen