beim datei laden mit ifstream letztes element doppelt



  • Hallo,

    ich hab da ein ganz verzwicktes Problem und zwar möchte ich gern eine ganz normale textdatei laden und die dort enthaltenen zahlen einem vector übergeben. bis dahin hat schon alles gut funktioniert nur ist mir aufgefallen, dass das letzte element immer doppelt vorkommt was sehr unpraktisch ist^^.

    hier mein code:

    #include <iostream>
    #include <fstream>
    #include <utility>
    #include <vector>

    using namespace std;

    int main(int argc, char * argv[])
    {
    vector<double> preis_liste;
    double temp;

    ifstream datei; //Datei laden
    datei.open(argv[1], ios_base::in);
    if (!datei.is_open())
    {
    cerr << "Fehler beim Laden der Datei." << endl;
    exit(1);
    }
    cout << "Datei geldaden: " << argv[1] << endl;

    while (!datei.eof())
    {
    datei >> temp;
    preis_liste.push_back(temp);
    cout << temp << endl;
    }

    }

    würde mich über schnelle antwort sehr freuen

    danke schonmal im vorraus

    felix



  • Hi...

    Denke musst die Bedingung in der while-Schleife ändern. Mit .eof() hatte ich auch schon öfters probleme.

    Versuchs mal so:

    while (datei >> temp) 
    { 
    	preis_liste.push_back(temp); 
    	cout << temp << endl; 
    }
    

    ...müsste eigentlich klappen.



  • Hallo smilingman

    vielen vielen Dank... funktioniert... 👍

    vielleicht bekommt ja jemand raus warum das so ist...

    aber nochmal vielen Dank du hast mir sehr geholfen...

    grüße

    Felix



  • #include <iostream>
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <algorithm>
    
    int main(int argc, char** argv)
    {
    	if (argc < 2) { std::cerr << "FEHLER: Zu wenige Parameter!" << std::endl; return 1; }
    
    	std::ifstream file_stream(argv[1]);
    	if (!file_stream) { std::cerr << "FEHLER: Datei konnte nicht gefunden werden!" << std::endl; return 1; }
    
    	std::vector<double> price_list;
    	std::copy(std::istream_iterator<double>(file_stream), std::istream_iterator<double>(), std::back_inserter(price_list));
    	std::copy(price_list.begin(), price_list.end(), std::ostream_iterator<double>(std::cout, "\n"));
    }
    

    und es ist knackig und kurz 😛



  • wriggler-felix schrieb:

    vielleicht bekommt ja jemand raus warum das so ist...

    eof() macht halt nicht das, was du denkst, dass es macht. Es fragt ein Flag ab, dass erst dann gesetzt wird, wenn einmal versucht wurde, über das Ende der Datei hinaus zu lesen.



  • wriggler-felix schrieb:

    vielleicht bekommt ja jemand raus warum das so ist...

    Vielleicht hilft dir ja dieser langweilige Text:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=eof#Answ


Anmelden zum Antworten