2016-05-11 10 views
0

Ich habe die folgende Datenbank:
Wie aus der Textdatei gelesen bis Komma mit ifstream in C++?

101884622 Johnson,Jack,Michael 239483 
441314978 Meyers,Sally,Elaine 019383 
684736222 Smallwood,Jason,Joseph 293812 
387240551 Ward,Richard,Charles 472041 
273639944 Vapson,Michelle,Regina 112039 
654230472 Wilson,Donald,Anthony 528763 
736459533 Utzig,Jacob,William 614524 
687130851 Brown,Betty,Mary  079813 

Ich versuche ifstream zu verwenden C++ Ausgabe des Mitglieds erste und Nachnamen nach der Textdatei zu machen. Wie kann man das schaffen? Hier ist mein Code

int main() { 
    double socialSN = 0; 
    string memberFName = ""; 
    string memberMName = ""; 
    string memberLName = ""; 
    double memberID = 0; 
    char div = ','; 

    ifstream infile; 
    infile.open ("salary_database2.txt"); 
    if(!infile) {cout << "Error: File not found or corrupt. "<< endl; return 1;} 

    while(infile >> socialSN >> memberLName >> div >> memberMName >> div >> memberFName >> memberID) { 
     cout << setprecision(0) << fixed; 
     cout << memberFName << "  " << memberMName << "  " << memberLName << endl; 
    } 
    return 0; 
} 

Der Compiler zeigt keine Fehler. Das Programm zeigt einfach nichts.

+1

Verwenden Sie 'std :: getline()' und teilen Sie die resultierende Zeile auf. –

+1

"First Middle and Last" Ich hoffe, das sind keine echten Menschen! –

Antwort

2

Die Extraktion operator>> verwendet Leerzeichen als Begrenzer zum Lesen, so dass es den gesamten Vor-, Mittel- und Nachnamen in memberLName mit Ihrer aktuellen Implementierung liest. Was Sie tun müssen, ist std::getline zu verwenden, das Lesen der Namen aufzuspalten Komma, wahrscheinlich so etwas wie:

while(infile >> socialSN && getline(infile, memberLName,',') && 
     getline(infile, memberMName,',') && 
     infile >> memberFName && infile >> memberID) 
{ 
     cout << setprecision(0) << fixed; 
     cout << memberFName << "  " << memberMName << "  " << memberLName << endl; 
} 
+0

Silly Fehler, du hast Code war richtig ... nur vergessen, den Dateinamen zurück zu ändern, weil ich getestet habe. Vielen Dank! –

1

Nach dieser Antwort:

https://stackoverflow.com/a/10376445/210971

Ein istream behandelt „weiß Leerzeichen "als Trennzeichen. Es verwendet ein Gebietsschema zu sagen Sie ihm, welche Zeichen Leerzeichen sind. Ein Gebietsschema enthält wiederum eine 0-Code-Facette, die Zeichentypen klassifiziert. Eine solche Facette etwa wie folgt aussehen könnte:

#include <locale> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <vector> 
#include <sstream> 

class my_ctype : public 
std::ctype<char> 
{ 
    mask my_table[table_size]; 
public: 
    my_ctype(size_t refs = 0) 
     : std::ctype<char>(&my_table[0], false, refs) 
    { 
     std::copy_n(classic_table(), table_size, my_table); 
     my_table[','] = (mask)space; 
    } 
}; 

nun wie folgt Ihr Programm aussehen:

int main() { 
    double socialSN = 0; 
    string memberFName = ""; 
    string memberMName = ""; 
    string memberLName = ""; 
    double memberID = 0; 

    ifstream infile; 
    infile.open ("salary_database2.txt"); 
    if(!infile) { 
     cout << "Error: File not found or corrupt. "<< endl; return 1; 
    } 
    std::locale x(std::locale::classic(), new my_ctype); 
    infile.imbue(x); 

    while(infile >> socialSN >> memberLName >> memberMName >> memberFName >> memberID) { 
     cout << setprecision(0) << fixed; 
     cout << memberFName << "  " << memberMName << "  " << memberLName << endl; 
    } 
    return 0; 
} 

Aber getline mit sieht sauberer und weniger verwirrend.