2016-06-01 7 views
0

Ich arbeite an einer App in QT, und ich bin ein wenig neu in C++ I/O; Ich möchte einige Daten aus einer CSV-Datei lesen, die momentan 2 Spalten und einige Zeilen enthält, zum Beispiel: (1 | 10) (2 | 20) Ich möchte sie nur in einem Array wie diesem speichern (1,10,2, 20); Für einige werden nur Werte aus der zweiten Spalte in meinem Array gespeichert. Hier ist ein Code; Ich habe viele Male überprüft, aber ich kann immer noch nicht sehen, was ich falsch mache:Das Lesen einer CSV-Datei mit der Funktion getline() funktioniert nicht richtig

void readingFiles::openFile(){ 

ofstream myFile; 
myFile.open("/home/Dan/Desktop/mainFile.csv" ,std::ios::app);} 

void readingFiles::addReadings(int readings1 , int readings2){ 



    if(myFile.is_open()){ 

      myFile<<readings1<<","<<readings2<<"\r"; 
      myFile.close(); 


} 
} 

vector<int> values ; 
ifstream iFile; 
iFile.open("/home/Dan/Desktop/mainFile.csv");} 
string data; 

void readingFiles::read(){ 
    for(int i =0; std::getline(iFile,data, ',') ; i++){ 
      values.insert(values.end() , atoi(data.c_str())); 
      qDebug("vector list is %i" , values[i]);} 
} 

So ist das Ergebnis, das ich bekomme, dass es die erste Zeile in der ersten Spalte liest, dann zu lesen bewegt aus der zweiten Spalte, und geht nie zurück zu den ersten (1, 10, 20, 30, 40 usw.). Noch einmal, was ich versuche zu bekommen ist (1, 10, 2, 20, 3, 30 usw.).

+1

Ihr Code ist total durcheinander. Am Ende der Zeile "myFile" fehlt ein ';' und Sie haben nicht übereinstimmende '{' Zeichen. Bitte schreiben Sie Code, der tatsächlich kompiliert wird. – Barmar

+0

oh im sorry, das sind Tippfehler, wenn ich diese Frage gestellt habe, mein Hauptcode ist in Ordnung lol ill fix den Beitrag – Dan

+0

Bitte auch ein lesbares Beispiel für die Eingabedatei. – Barmar

Antwort

0

Ihr Problem ist, dass beim zweiten Anruf getline10\n2 zurückgibt. Dann atoi konvertiert dies zu 10. So verlieren Sie die 2. getline soll Zeilenumbrüche verwerfen, so dass ich nicht sicher bin, warum das passiert. Es ist ein bisschen hässlich, aber analysiere 10\n2 in data, um irgendetwas nach \n aufzunehmen und zum Vektor hinzuzufügen.

Ich habe dies mit VC 2013 getestet und das ist das Verhalten von getline mit Trennzeichen. Ich googelte herum und es scheint, als ob es beabsichtigt ist, dass getline mit Trennzeichen Newline als ein Literal-Zeichen behandelt. Das funktioniert:

string line; 
for (int i = 0; std::getline(myFile, line); i++) 
{ 
    stringstream ss(line); 
    for (int i = 0; std::getline(ss, data, ','); i++) 
    { 
     values.insert(values.end(), atoi(data.c_str())); 
    } 
} 
for (int i = 0; i < values.size(); i++) 
{ 
    cout << "vec=" << values[i] << endl; 
} 
Verwandte Themen