2017-04-17 3 views
0

Ich bin nicht sehr gut in C++, aber ich muss Operationen auf Daten in CSV-Datei durchführen.Wie kann ich Dateiverzeichnis für CSV-Datei in C++ angeben?

die Datei in dem Format von Tagen im Vergleich Klassifizierung, so daß beispielsweise

revenues,profit,volume 
    481.21,144.36,30 
    449.13,134.74,28 
    544.11,163.23,34 
    368.93,110.68,23 

so dass erste Reihe Klassifizierung angibt, und von der 2. Zeile und vorwärts, einträgt day1, day2, day3 .... usw.

.cpp .csv und das ausführbare Programm sind im selben Verzeichnis, aber ich vermutete, dass es meine Datei nicht richtig liest.

so habe ich einen einfachen Test und codiert die folgenden Zeilen nur um zu sehen, ob es die Daten als Tage im Vergleich zu Klassifikationen drucken können, aber es gibt mir 0'en überall

ios_base::sync_with_stdio(false); 
cin.tie(NULL); 
cout.tie(NULL); 
ifstream fin("data.csv"); 
int days = 1; 
double revenues,profit,volume; 
while (fin >> revenues >> profit >> volume){ 
    O[1][days] = revenues; 
    O[2][days] = profit; 
    O[3][days] = volume; 
    days++; 
} 
for (int t = 1; t <= days; t++){ 
    for (int i = 1; i <= 3; i++){ 
     cout << O[i][t] << " "; 
    } 
    cout << endl; 
} 
+0

Versuchen Sie, ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen. Und denken Sie daran, dass Array-Indizes auf * null * basieren (d. H. Ein Array aus drei Elementen hat die Indizes "0", "1" und "2"). –

+0

Sind Sie sicher, dass sich Ihre Binärdatei auch im selben Ordner wie Ihre CSV-Datei befindet? Und bitte geben Sie Ihren Fehler an. Öffnet es die Datei oder was genau funktioniert nicht? – retinotop

+0

Es spielt keine Rolle, wo Ihre 'cpp' Datei ist oder wo Ihr * binary * Programm ist, was wichtig ist, wo Sie Ihr Programm ausgeführt haben. – Galik

Antwort

0

Es ist nicht wichtig, wo die CPP-Datei ist gelegen. Es ist wichtig, wo sich die .exe-Datei befindet (kompilierter Code, der ausgeführt wird). Wenn sich die EXE- und die CSV-Datei im selben Verzeichnis befinden, ist alles in Ordnung.

Ihr Problem ist die Art, wie Sie lesen; Wenn Sie schnell debuggen, werden Sie sehen, dass der while-Block nie ausgeführt wird, weil (fin >> revenues >> profit >> volume) vom ersten Mal fehlschlägt. Der Grund dafür ist, wie der Extraktionsoperator >> für Streams funktioniert. Mehr Details finden Sie überall (wie here). Die Kurzgeschichte: Es kann kein Doppel aus dem Stream gelesen werden, da Werte durch Kommas getrennt sind. Es wird eine Zeichenfolge gelesen, bis ein Leerzeichen angezeigt wird (einschließlich des Kommas) und es versucht, diese Zeichenfolge zu einem Doppelklick zu analysieren, und es wird fehlschlagen.

Sie sollten versuchen, etwas wie Zeile für Zeile zu lesen. Sie teilen die Linie in drei Werte und verwenden Sie diese.

Oder Sie können Strings bis Kommas lesen und diese Strings auf doppelte Werte analysieren. Ich habe einige Code setzen:

string line; 

while (fin.good()){ 
    std::getline (fin, line); 
    stringstream line_stream(line); 
    string value; 

    std::getline (line_stream, value, ','); 
    O[1][days] = atof(value.c_str()); 
    std::getline (line_stream, value, ','); 
    O[2][days] = atof(value.c_str()); 
    std::getline (line_stream, value, ','); 
    O[3][days] = atof(value.c_str()); 
    days++; 
} 

Die std::getline() einen String bis Newline liest oder ''.

Oder Sie können einfach nach einer dedizierten CSV-Bibliothek in C++ suchen und diese direkt verwenden.

+0

Das half in einem Sinne, dass ich Zahlen in den Daten gefunden bekomme, aber die ausgedruckte Version nicht mit den tatsächlichen Daten, d. H.sagen wir, für 1 = Einnahmen, 2 = Gewinn, 3 = Volumen, dann gedruckt O [2] [25]! = der Gewinn am 25. Tag und ist eigentlich, sagen wir, Einnahmen am 31. Tag etwas. –

+0

@KevvyKim, dies kann mehrere Ursachen haben, z. B. die Art und Weise, wie Sie die Daten in Ihr Array namens "O" oder das Format Ihrer Datei schreiben. Bitte fügen Sie die neue Version Ihres Codes mit einigen Daten als Eingabe hinzu. –

+0

Ich habe gerade aktualisiert, wie die Daten formatiert sind. Wende den ähnlichen Begriff von getline an, aber sollte ich for-Schleifen für i und Tage für O [i] [Tage] einbeziehen? –

Verwandte Themen