Datei einlesen und Bearbeiten!



  • Moin! Ich habe bis morgen eine Arbeit abzugeben! Undzwar haben wir eine textdatei bekommen, in der Kursdaten stehen! So sieht die Datei aus:

    500340,65.30,"4:37",0.00,62.70,65.50,65.30,0
    529650,23.00,"4:29",0.00,22.90,23.90,23.00,0
    555750,72.50,"4:38",0.00,70.40,73.90,72.50,0
    623100,67.80,"4:38",0.00,66.00,67.90,67.80,0
    627500,33.40,"4:39",0.00,32.96,34.00,33.40,0
    725754,37.00,"4:39",0.00,37.00,37.00,37.00,0
    755140,16.00,"4:40",0.00,16.00,16.45,16.00,0
    766403,25.65,"4:40",0.00,24.80,25.65,25.65,0
    785600,27.50,"4:41",0.00,27.50,27.50,27.50,0
    852016,52.00,"4:39",0.00,51.50,52.00,52.00,0
    853687,130.00,"4:40",0.00,129.50,131.00,130.00,0
    856244,29.00,"4:37",0.00,29.00,29.00,29.00,0
    870747,74.30,"4:39",0.00,72.75,74.80,74.30,0
    

    Nun soll aus der Liste nur die Erste Nummer(500340) und der Betrag(65.30) in eine neue Datei geschrieben werden! Die Datei soll denn so aussehen!

    WKN=500340 WERT=65.30 EUR
    WKN=529650 WERT=23.00 EUR
    usw.
    

    Momentan bin ich sowit, das ich die Datei komplett kopiere!
    Hier der

    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	char zeichen, schreib='j';
    	char quell_name[_MAX_PATH], ziel_name[_MAX_PATH];
    	ifstream quelle;
    	ofstream ziel;
    
    	/* Name der Quelldatei einlesen */
        cout << "\nPfad und Name der Quelldatei?  ";
    	cin >> quell_name;
    
        /* Quelldatei oeffnen */
        quelle.open(quell_name, ios::binary);
    	if (!quelle)
        {
    		cout << "\n" << quell_name
    			 << " konnte nicht geoeffnet werden!\n";
    		exit(-1);
    	}
    
    	/* Name der Zeildatei einlesen */
        cout << "\nPfad der und Name der Zieldatei?  ";
    	cin >> ziel_name;
    
    	/* Existiert die Datei schon ? */
        ziel.open(ziel_name, ios::in | ios::binary);
    	if (ziel)
        {
    		cout << ziel_name << "existiert schon."
    			 << "\nSoll sie ueberschrieben werden "
    			 << "(<j>a oder <A>bbruch)?  ";
    		cin >> schreib;
    		if (schreib != 'j' && schreib != 'J')
               exit(-1);
    	}
    
    	/* wenn nicht, Zieldatei anlegen */
    	else
        {
    		ziel.clear();
    		ziel.open(ziel_name, ios::binary);
    		if (!ziel)
            {
    			cout << "\n" << ziel_name
    				 << " kann nicht gespeichert werden!";
    			exit(-1);
    		}
    	}
    
    	/*Datei zeichenweise kopieren*/
    	cout << endl;
    	while (quelle.get(zeichen))
        {
    		if (zeichen = '"')
    		{
    			ziel.put(zeichen);
    		}	         
    	}
    	return(0);
    }
    

    Meine Problem ist nun, wie bekomme uch nur die beiden werte in meine neue Datei???

    Ich hoffe ihr könnt mir helfen!



  • MC_Morfeus schrieb:

    Moin! Ich habe bis morgen eine Arbeit abzugeben!

    Ja. Du. Nicht wir.

    Bye, TGGC (Demo or Die)



  • hm... du kannst zB mit ifstream::getline eine Zeile auslesen, dann bis zum ersten komma suchen, den substr davon bilden (siehe std::strin::substrg) dann mit atoi in zahl umwandeln, dann bis zum zweiten komma suchen (std::string::find) und auch mit atoi umwandeln, und dann in die datei schreiben und dann nächste zeile nehmen, bis alle ruas sind



  • Kannst du mir das vielleicht genauer erklären, wenn es nicht zuviel ist? bin noch anfänger!



  • char line[1024]
    ifstream f('"eingabe.txt");
    f.getline(line, 1024);
    string s(line);
    size_t f = s.find(",");
    string ss = s.substr(0, f); // in ss steht jetzt das bis zum ersten komma
    int zahl = atoi(ss.c_str());
    s = s.substr(f);
    
    // weiter schaffst du alleine, s wurde jetzt nach dem ersten komma abgeschnitten
    wirf nen debbuger an und schau, wie s jetzt aussieht odre so
    


  • OK, die nummer ist schonmal rausgefilter! Danke! Jetzt fählt nur nich der Betrag, hinterm ersten ","!



  • @Maxi:

    Maxi schrieb:

    [...]dann mit atoi in zahl umwandeln [...] und auch mit atoi umwandeln [...]

    Es ist hier doch völlig irrelevant, ob du die Zahl als String oder die Zahl als int/double/o.ä. in die Datei schreibst...

    Maxi schrieb:

    char line[1024]
    ifstream f('"eingabe.txt");
    f.getline(line, 1024);
    string s(line);
    size_t f = s.find(",");
    string ss = s.substr(0, f); // in ss steht jetzt das bis zum ersten komma
    int zahl = atoi(ss.c_str());
    s = s.substr(f);
    
    // weiter schaffst du alleine, s wurde jetzt nach dem ersten komma abgeschnitten
    wirf nen debbuger an und schau, wie s jetzt aussieht odre so
    

    Komplizierter gehts nicht, oder? 😉

    Gruß Caipi



  • Such dir im Forum ne Split-Funktion indem du nach explode* suchst.

    Dann lies zeilenweise ein und rufe die Split-Funktion mit der Zeile auf und dann kannst du über [0] und [1] auf die jeweiligen Token zugreifen.



  • was denn? wie würdest du es denn machen?



  • string line; // so bist du nicht von einer bestimmten Länge abhängig
    ifstream f("eingabe.txt");
    getline(f, line); // ersetzt durch f.getline(...)
    // string s(line); fällt weg..
    string::size_type pos = line.find(","); // du musst einen anderen Bezeichner wählen :-). Außerdem würde ich size_type nehmen...
    
    // Hier aber ein if reinhauen... (imho)
    string ss = line.substr(0, pos); // in ss steht jetzt das bis zum ersten komma
    // int zahl = atoi(ss.c_str()); welcher Sinn steht dahinter?
    line = line.substr(pos + 1); // jetzt ist line erst ohne den ersten Teil inklusive Komma. Wobei ich das anders machen würde...
    

    Das wären also meine Kritikpunkte. :).

    Gruß Caipi



  • der code war nur so schnell hingekliert 😉

    also mit getline(f, line) kannte ich nicht 🙂
    ich nehm immer fürs finden von zeichen in strings die variable f 😉 hab ncih auf den ifsream geachtet ;), btw: size_t is sie doch
    mit dem if is klar, sonsts kanns ausahmefehler geben
    mit dem in zahl umwandeln hat den sinn, mit dieser zahl weiterzuarbeiten, muss natpürlich nicht sein, wenn man das nur schnell wieder in eine datei schreiben soll
    wie würdest du die letzte zeile ändern?



  • getline(f, line); // ersetzt durch f.getline(...)
    

    funktionier bei mir nicht !

    error C2065: 'getline' : nichtdeklarierter Bezeichner!

    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	char quell_name[_MAX_PATH], ziel_name[_MAX_PATH];
    	ifstream quelle;
    	ofstream ziel;
    
    	/* Name der Quelldatei einlesen */
        cout << "\nPfad und Name der Quelldatei?  ";
    	cin >> quell_name;
    
        /* Quelldatei oeffnen */
        quelle.open(quell_name, ios::binary);
    	if (!quelle)
        {
    		cout << "\n" << quell_name
    			 << " konnte nicht geoeffnet werden!\n";
    		exit(-1);
    	}
    
        string line; 
        ifstream f(quell_name);
        getline(f, line); 
        string::size_type pos = line.find(","); 
    
        string ss = line.substr(0, pos); 
        line = line.substr(pos + 1); 
    
    	return 0;
    }
    

    Was isn da falsch?



  • #include <string>



  • Jo, das funzt schonmal! der gibt jetzt aber nur die erste Zeile aus, und der Betrag fählt auch noch! Kann mir da vielleicht noch jemand helfen?



  • auch auf die gefahr, gesteinigt zu werden: wie wärs mit dem guten alten scanf?

    #include<cstdio>
    
    scanf(in,"%d , %lf , %*[^\n]%*[\n]",&wkn,&wert);
    printf(out,"WKN=%d WERT=%lf EUR\n",wkn,wert);
    

    du mußt dann allerdings mit c-filepointern arbeiten anstatt mit c++-streams.



  • TGGC schrieb:

    MC_Morfeus schrieb:

    Moin! Ich habe bis morgen eine Arbeit abzugeben!

    Ja. Du. Nicht wir.

    Dann halt dich einfach da raus, du Spacko! So Leute wie dich hamse doch früher aufm Schulhof verkloppt.
    Über 2000 Einträge und 99,9% davon nur Rumgeflenne wie n Mädchen.



  • Das verstehe ich nicht so ganz! Ich denke das da doch irgendwo noch eine Schleife rum muss, oder??? Und es fehlt immer noch was für den wert!



  • MC_Morfeus schrieb:

    Das verstehe ich nicht so ganz! Ich denke das da doch irgendwo noch eine Schleife rum muss, oder???

    Der Code-Snippet von Konfusius war ein einfaches Beispiel, wie man aus deiner Zeile nur WKN und WERT einlesen kann. Falls du mehrere Zeilen einlesen willst, musst du in der Tat eine Schleife drumherum machen.

    Und es fehlt immer noch was für den wert!

    Sorry, aber hast du schonmal daran gedacht, selber ein wenig zu denken?
    Maxi hat dir doch schon gezeigt, wie du es für WKN machst. Das musst du jetzt fast 1:1 auf WERT übertragen.

    Falls du aber jetzt schon stundenlang auf der Suche nach einem C++-Weg bist, wie du "WERT" korrekt einlesen kannst, jedoch noch keine zufriedenstellende Lösung gefunden hast, dann poste doch deinen Ansatz und wir sagen dir warum was nicht klappt o.ä. :).

    Gruß Caipi



  • Konfusius schrieb:

    wie wärs mit dem guten alten scanf?

    .. und wie wäre es mit dem guten alten C++-Weg

    #include <iostream>
    #include <iomanip>
    #include <fstream>
    #include <iterator>
    #include <algorithm>
    
    class Info
    {
    public:
        friend std::istream& operator>>( std::istream& in, Info& info )
        {
            char komma;
            return (in >> info.m_nr >> komma >> info.m_wert).ignore( 9999, '\n' );
    
        }
    
        friend std::ostream& operator<<( std::ostream& out, const Info& info )
        {
            return out << "WKN=" << info.m_nr << " WERT=" 
                << std::fixed << std::setprecision(2) << info.m_wert << " EUR\n";
        }
    
    private:
        int m_nr;
        double m_wert;
    };
    
    int main()
    {
        using namespace std;
        copy( istream_iterator< Info >( ifstream( "in.txt") ), istream_iterator< Info >(),
            ostream_iterator< Info >( ofstream( "out.txt" ) ) );
        return 0;
    }
    

    du mußt dann allerdings mit c++-streams arbeiten anstatt mit c-filepointern. 😉

    Gruß
    Werner



  • Ich habe nun ein weiteres Problem! Undzwar habe ich folgenden

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	char quell_name[_MAX_PATH], ziel_name[_MAX_PATH];
    	float WERT_DM;
    	ifstream quelle;
    	ofstream ziel;
    
    	/* Name der Quelldatei einlesen */
        cout << "\nPfad und Name der Quelldatei?  ";
    	cin >> quell_name;
    
        /* Quelldatei oeffnen */
        quelle.open(quell_name, ios::binary);
    	if (!quelle)
        {
    		cout << "\n" << quell_name
    			 << " konnte nicht geoeffnet werden!\n";
    		exit(-1);
    	}
    
        string line; 
        ifstream f(quell_name);
    
    	while(getline(f, line))
        {
    
    	getline(f, line); 
        string::size_type pos = line.find(","); 
    
        string WKN = line.substr(0, pos); 
        line = line.substr(pos + 1); 
    
    	string::size_type pos1 = line.find(","); 
    
        string WERT_EUR = line.substr(0, pos1); 
        line = line.substr(pos1 + 1);
    
    	cout << "WKN=" << WKN << " "<< "WERT=" << WERT_EUR << " DM\n";
    }
    	return 0;
    }
    

    Problem dabei ist, das die Schleife irgendwie nicht korrekt funzt! Sie holt nicht alle Datensätze aus der Datei! So wie es aussieht immer nur jede 2te Zeile aus der Datei!

    Kann mir jemand sagen warum?


Anmelden zum Antworten