"?" aus Datei einlesen



  • Hacker schrieb:

    Dankeschön, das lesen wir natürlich alles sofort.

    😮 wirklich!? 😃



  • Swordfish schrieb:

    Hacker schrieb:

    Dankeschön, das lesen wir natürlich alles sofort.

    😮 wirklich!? 😃

    Nein! 😃 😃



  • danke für eure Hilfe mit den String-Vergleichen.

    Aber nochmal zu dem ?.
    Trotz korrekter Vergleiche, die das ? immernoch als 0 gelesen.

    Weißt ihr warum?



  • Hacker schrieb:

    Swordfish schrieb:

    Hacker schrieb:

    Dankeschön, das lesen wir natürlich alles sofort.

    😮 wirklich!? 😃

    Nein! 😃 😃

    Aha. Das heißt also, ich sollte mein Codebeispiel, in dem das Problem auftritt, so kurz wie möglich halten, damit ich nicht unnötig mehr Zeit der evtl. hilfsbereiten Leser stehle, als nötig? 😉

    uerderli schrieb:

    Trotz korrekter Vergleiche, die das ? immernoch als 0 gelesen.

    Weißt ihr warum?

    Nein, wir weissen es nicht.



  • uerderli schrieb:

    danke für eure Hilfe mit den String-Vergleichen.

    Aber nochmal zu dem ?.
    Trotz korrekter Vergleiche, die das ? immernoch als 0 gelesen.

    Weißt ihr warum?

    oh Gott, tschuldigung für meine Rechtschreibung 😮



  • Swordfish schrieb:

    Hacker schrieb:

    Swordfish schrieb:

    Hacker schrieb:

    Dankeschön, das lesen wir natürlich alles sofort.

    😮 wirklich!? 😃

    Nein! 😃 😃

    Aha. Das heißt also, ich sollte mein Codebeispiel, in dem das Problem auftritt, so kurz wie möglich halten, damit ich nicht unnötig mehr Zeit der evtl. hilfsbereiten Leser stehle, als nötig? 😉

    Ja. 😉



  • uerderli schrieb:

    Mit
    token = strtok(zeile, separator);
    trenne ich dabei die Werte.

    Das ist keine gute Idee. Lese doch lieber gleich die Zahlen aus der Datei ein und überlese die Kommas dazwischen. Falls Du Beispiele suchst, suche hier im Forum nach 'csv istream' oder in Google nach 'csv Datei lesen istream'.

    Das Einlesen des '?' statt einer Zahl, kann man mit einem sogenannten Manipulator lösen.
    Hier eine Code-Skizze:

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <vector>
    
    template< char C >
    std::istream& Char( std::istream& in )
    {
        char c;
        if( in >> c && c != C )
            in.setstate( std::ios_base::failbit );
        return in;
    }
    
    // --   Manipulator, zum Einlesen von Zahlen und einem '?'
    //      wird ein '?' erkannt, so erhält die Zahl den Wert '-42.'
    struct query
    {
        explicit query( double& nr ) : m_number( nr ) {}
        friend std::istream& operator>>( std::istream& in, query q )
        {
            typedef std::istream::traits_type Traits;
            if( in >> std::ws && !in.eof() )
            {
                if( Traits::to_char_type( in.peek() ) == '?' )
                {
                    in.ignore(1); // '?' überlesen
                    q.m_number = -42.;
                }
                else
                    in >> q.m_number;
            }
            return in;
        }
    private:
        double& m_number;
    };
    
    int main()
    {
        using namespace std;
        ifstream datei("datei.txt");
        if(!datei)
        {
            cerr << "Fehler beim Öffnen";
            cin.get();
            return 2;
        }
        for( int zeile = 1; datei; ++zeile )
        {
            cout << zeile << ".Zeile: ";
            double zahl;
            for( int i=0; i<26 && datei >> query( zahl ) >> Char<','>; ++i )
            {
                cout << zahl << "|";
            }
            string yes_no;
            if( datei >> yes_no )
                cout << yes_no;
            cout << endl;
        }
        cin.get();
        return 0;
    }
    

    Gruß
    Werner



  • @Werner
    vielen Dank!

    so funktioniert es perfekt!



  • Blöde Frage, aber wieso funktioniert das?

    for( int i=0; i<26 && datei >> query( zahl ) >> Char<','>; ++i )

    Char ist doch eine Funktion, welcher >>-Operator passt da?



  • if(strcmp(token, "no") != 0 || strcmp(token, "yes") != 0 || strcmp(token, "?") != 0)
    

    Diese Bedingung kann niemals "false" werden. Jeder mögliche String ist entweder ungleich "no" ODER (||) ungleich "yes" ODER (||) ungleich "?".
    Was du suchst ist UND (&&).



  • Ethon schrieb:

    Blöde Frage, aber wieso funktioniert das?

    for( int i=0; i<26 && datei >> query( zahl ) >> Char<','>; ++i )

    Char ist doch eine Funktion, welcher >>-Operator passt da?

    Dieser:

    namespace std
    {
        template <class charT, class traits = char_traits<charT> >
            class basic_istream : virtual public basic_ios<charT,traits> 
        {
        public:
            // Kapitel 27.7.2.2.3 Formatted input: [istream::extractors]
            basic_istream<charT,traits>& operator>>(
                basic_istream<charT,traits>& (*pf)(basic_istream<charT,traits>&) );
            // 1 Effects: None. This extractor does not behave as a formatted input function (as described in 27.7.2.2.1.)
            // 2 Returns: pf(*this).
    
        // ...
        }
    }
    

    Funktioniert genau so wie z.B. std::ws.

    Gruß
    Werner


Anmelden zum Antworten