Datei einlesen und Bearbeiten!



  • 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
    


  • das fehlt noch der passende Header -> #include <stringstream>

    (und die "double WERT_DM;" mußt du auch dekalieren, damit du damit arbeiten kanns)



  • Jetzt kommt nur noch eine Fehlermeldung: fatal error C1083: Include-Datei kann nicht geoeffnet werden: 'stringstream': No such file or directory ! Was und wie kann ich dagegen machen?



  • <sstream>



  • Nun funktioniert ja auch alles! Nun habe ich noch ein letztes Problem! Undzwar bricht das Programm in der Release-Funktion nach der letzten ausgabe einfach ab! Das möchte ich verhindern! Weis nur nicht wie das gehen soll??

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main()
    {
    	char schreib='j';
    	char quell_name[_MAX_PATH], ziel_name[_MAX_PATH];
    	double WERT_DM;
    	const double UMR_F = 1.96;
    	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);
    		if (!ziel)
            {
    			cout << "\n" << ziel_name
    				 << " kann nicht gespeichert werden!";
    			exit(-1);
    		}
    	}
    
        string line; 
        ifstream f(quell_name);
    
    	// Solange wiederholen, bis keine Zeile mehr verfügbar ist
    	while(getline(f, line))
        {
    		// Herausfiltern der WKN
    		string::size_type pos = line.find(","); 
    		string WKN = line.substr(0, pos); 
    		line = line.substr(pos + 1); 
    
    		// Herausfiltern des WERT's
    		string::size_type pos1 = line.find(","); 
    	    string WERT_EUR = line.substr(0, pos1); 
    	    line = line.substr(pos1 + 1);
    
    		// Umwandeln von String in einen Double-Wert 
    		stringstream conv(WERT_EUR);double EUR;conv>>EUR;
    
    		// DM ausrechnen
    		WERT_DM = EUR*UMR_F;
    
    		// Einfügen in die ZielDatei
    		ziel << "WKN=" << WKN << " "<< "WERT=" << WERT_DM << " DM\n";
    
    	}
    
    	cout << "Daten erfolgreich ausgelesen und kopiert!\n";
    
    	return 0;
    
    }
    


  • Hallo
    Also wenn ich das jetzt richtig verstehe möchtest du nicht das deine konsole einfach zu geht richtig ?

    Wenn du das nicht möchtest setze statt return 0;
    retval=getchar(); // warten auf enter !!! ein und schon sollte es gehen.

    CU Cooper


Anmelden zum Antworten