Datei einlesen und Bearbeiten!



  • 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?



  • while(getline(f, line))
    {
        getline(f, line);
        //...
    }
    

    Dein Gefühl täuscht dich nicht - das getline() in der while-Bedingung holt eine Zeile, das getline() am Anfang der Schleife holt die nächste Zeile (und verwirft die Eingabe vom ersten). Letzteres kannst du also weglassen.

    Btw, hat das einen bestimmten Grund, daß du die Datei doppelt öffnest?
    oder anders: Warum holst du dir deine Eingaben nicht aus der "quelle"? Die hat doch schon die richtige Datei geöffnet.



  • Alles klar! Danke!

    Nun soll der Wert dort noch in DM stehen! Da hatte ich gedacht das ich eine neue Variable "float WERT_DM;" nehme, und vor der Ausgabe noch ein "WERT_DM = WERT_EUR*1.955" schreibe! Da funz allerdings irgendwie nicht!

    error C2676: Binaerer Operator '*' : 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefinierten Operator geeigneten Typ nicht! Was tun?



  • Klar, WERT_EUR ist ja auch keine Zahl (auch wenn du dort die Text-Entsprechung einer Zahl eingetragen hast), sondern eine Zeichenkette - und die kannst du nicht "multiplizieren". Das heißt, du mußt erst deinen String in einen Double-Wert umwandeln, bevor du damit rechnen kannst (klassisch mit atof() oder modern mit "stringstream conv(WERT_EUR);double EUR;conv>>EUR;" oder ähnlichem).



  • dummfug schrieb:

    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.

    Armseliges Statement.



  • Meinst du das(stringstream conv(WERT_EUR);double EUR;conv>>EUR;) sollte ohne Probleme funktionieren! Bei mir tauchen den vier neue Fehlermeldung auf!

    Dein Teil, habe ich nun dort eingefügt:

    while(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);
    
    		stringstream conv(WERT_EUR);double EUR;conv>>EUR;
    
    		WERT_DM = EUR*UMR_F;
    		cout << "WKN=" << WKN << " "<< "WERT=" << WERT_EUR << " DM\n";
    	}
    

    FEHLER:

    error C2079: 'conv' verwendet undefiniertes class 'basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >'
    
    error C2440: 'initializing' : 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' kann nicht in 'int' konvertiert werden
            Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
    
    error C2296: '>>' : Ungültig, da der linke Operand vom Typ 'double' ist
    
    error C2297: '>>' : Ungültig, da der rechte Operand vom Typ 'double' ist
    

Anmelden zum Antworten