Wie kann ich zeilenweise eine Textdatei in den Speicher einlesen?



  • Hi,

    vielen Dank für den Code, aber bei mir funktionierts leider irgendwie nicht,
    ich will parktisch, den inhalt der Textdatei in den Speicher laden, dann ne eingabe machen wo ich einen beliebigen Namen eingebe, der soll dann im Speicher gefunden werden, und dann im Dos Fenster ausgegeben werden, des ganze soll ne Anredenbetimmung sein, also der gefundene Name mit der passenden Anrede! 🙄



  • Flanders86 schrieb:

    vielen Dank für den Code, aber bei mir funktionierts leider irgendwie nicht, ..

    was funktioniert denn nicht?

    Flanders86 schrieb:

    ich will parktisch, den inhalt der Textdatei in den Speicher laden, dann ne eingabe machen wo ich einen beliebigen Namen eingebe, der soll dann im Speicher gefunden werden, und dann im Dos Fenster ausgegeben werden, des ganze soll ne Anredenbetimmung sein, also der gefundene Name mit der passenden Anrede! 🙄

    wie sieht denn das Format der Datei aus - und nach was GENAU möchtest Du suchen?



  • Ok,
    also da ist ein Auszug aus der .txt Datei

    1 male Alexander
    2 female Julia
    3 female Andrea

    also ich möchte nach dem Vornamen suchen, wen er gefunden ist die passende Anrede dazu ausgeben, die ich dann im Programm noch generier

    mfg Flanders



  • Am besten Du bastelst Dir eine class oder struct, die einen Eintrag bzw. eine Person beschreibt ...

    struct Entry // EIN Eintrag in der Textdatei, bzw. eine Person
    {
        enum sex { male, female };
        Entry() : m_sex(), m_name() {}
        Entry( sex sx, const std::string& name )
            : m_sex( sx )
            , m_name( name )
        {}
        bool operator==( const std::string& name ) const
        {
            return m_name == name;
        }
        friend std::istream& operator>>( std::istream& in, Entry& e )
        {   // Einlesen: <Nr> [male|female] <Name>
            using namespace std;
            int nr;
            string sex, name;
            if( in >> nr >> sex >> name )
            {
                if( sex == "male" )
                    e = Entry( Entry::male, name );
                else if( sex == "female" )
                    e = Entry( Entry::female, name );
                else
                    in.setstate( ios_base::failbit );
            }
            return in;
        }    
        friend std::ostream& operator<<( std::ostream& out, const Entry& e )
        {   // Ausgeben: [Herr|Frau] <Name>
            return out << (e.m_sex == Entry::male? "Herr": "Frau") << " " << e.m_name;
        }
    private:
        sex m_sex;
        std::string m_name;
    };
    

    und das main-Programm ändert sich nicht wesentlich:

    #include <fstream>  // ifstream
    #include <iostream> // cout, u.a.
    #include <string>
    
    // struct Entry (s.o.)
    
    int main()
    {
        using namespace std;
        ifstream textdatei( "input.txt" );
        for( Entry e; textdatei >> e; )
        {
            if( e == "Julia" )
                cout << e << endl;
        }
        return 0;
    }
    

    Gruß
    Werner



  • Hallo,

    vielen Dank für die ganze mühe, das Problem ist, ich hab in der Textdatei
    ca. 40000 Namen und da kann ich ja keine struktur anlegen für jeden Namen, ich bin jetzt soweit das ich mittels ifstream die datei einlesen kann, nur noch nicht nach dem gesuchten Namen suchen kann, das is momentan mein Hauptproblem eigentlich

    mfg
    Flanders



  • Flanders86 schrieb:

    ...da kann ich ja keine struktur anlegen für jeden Namen, ...

    😕 Warum nicht ?
    (BTW: Du legst eher ein "Objekt" (= "Instanz einer Struktur") an)
    Was immer Du in C++ tust, musst Du im Speicher tun - wenn der nicht reicht, musst Du evtl. in Teilen einlesen und auswerten, aber letztlich wirst Du Objekte anlegen müssen dafür.

    Gruß,

    Simon2.



  • boah, keine ahnung wie das gehen soll, soweit reicht mein wissen nicht.

    mfg Flanders



  • Das mit der eigenen Klasse ist wieder mal viel zu kompliziert für einen Anfänger erklärt.
    Du machst einfach folgendes:

    1. bool nameGefunden==false;
    2. Name eingeben (mit cin)
    3. Datei öffnen (mit ifstream)
    4. while-Schleife: solange die Datei nicht am Ende ist (datei.eof ()!=0) und nameGefunden==false
    4.1. Zeile aus Datei auslesen (string zeile; datei>>zeile;)
    4.2. Zeile auseinanderschnippeln, so daß Du ID, Anrede und Name als jeweils eigene Stringvariable hast
    4.3. Wenn der eingegebene Name gleich der Name aus dem String ist:
    4.3.1. Anrede ausgeben (bzw.: wenn Geschlecht gleich männlich, dann Ausgabe "Herr", ansonsten "Frau")
    4.3.2. nameGefunden=true
    5. datei.close ();

    Das war's.

    P.S.: In diesem Fall werden auch nicht die 40000 Namen in den Programmspeicher geladen, sondern es ist gleichzeitig jeweils nur eine Zeile gespeichert, die danach wieder verworfen wird, wenn die nächste Zeile gelesen wird.



  • Flanders86 schrieb:

    ... ich hab in der Textdatei
    ca. 40000 Namen und da kann ich ja keine struktur anlegen für jeden Namen

    Hallo Flanders,

    natürlich geht das - z.B. so:

    ifstream textdatei( "input.txt" );
        vector< Entry > alle( istream_iterator< Entry >( textdatei ), istream_iterator< Entry >() );
        // Bem.: erfordert zusätzlich #include <vector> und #include <iterator>
    

    In der Variablen 'alle' sollten sich jetzt die besagten 40000 EInträge befinden, wenn alles gut gegangen ist.

    Flanders86 schrieb:

    .. ich bin jetzt soweit das ich mittels ifstream die datei einlesen kann, nur noch nicht nach dem gesuchten Namen suchen kann, das is momentan mein Hauptproblem eigentlich

    zeig uns doch einfach mal das was Du hast.

    NES-Spieler schrieb:

    Das mit der eigenen Klasse ist wieder mal viel zu kompliziert für einen Anfänger erklärt.

    Ja sicher - aber wo soll man anfangen? Und wie kommt jemand, der nicht mal weiß, dass man von einem Objekt 'viele' im Speicher anlegen kann, zu so einer Aufgabe?

    Gruß
    Werner



  • Hey,

    ja also dein Vorschlag versteh ich als Anfänger, ich versuch mich mal dran.
    mal gucken obs klappt 😃

    also vielen dank dafür, sehr nett 😉

    Flanders



  • okay hier hab ich mal mein Quelltext:

    #include <iostream>
    #include <fstream>

    using namespace std;

    int main(void)
    {

    int ieingabe;
    string iname;
    char c;
    char a[400];
    int i=0;
    int j;

    cout<<"Anredenbestimmung - TestLauf";
    cout<<"\n-----------------------------";

    do
    {
    cout<<"\n\nAus welchem Land, stammt das Mailing ?";

    cout<<"\n\nDeutschland ( 1 )";
    cout<<"\nEngland ( 2 )";
    cout<<"\nFrankreich ( 3 )";

    cout<<"\n\nBitte geben Sie die Zahl, f\x81r das Land ein.";
    cout<<"\n\n\t\t ";

    cin>>ieingabe;

    if(ieingabe==1)
    {
    cout<<"\nSie haben die Nr 1 gewaehlt, (Deutschland)!";
    cout<<"\n\n\nBitte geben Sie den gew\x81nschten Namen ein.";
    cout<<"\n\n\n";
    cin>>iname;
    string str=iname;
    }

    }while(ieingabe==0 || ieingabe>=4);

    ifstream Quelldatei;
    Quelldatei.open("neu.txt", ios_base::in);

    if (!Quelldatei)
    cout <<"Eingabe Datei kann nicht geoeffnet werden\n";
    else {
    while (Quelldatei.get(c))
    {
    a[i]=c;
    i++;
    }
    for (j=0;j<i;j++)
    {
    cout << a[j];
    }
    }

    getchar ();
    return 0;
    }



  • Flanders86 schrieb:

    ifstream Quelldatei;
        Quelldatei.open("neu.txt", ios_base::in);
    
        if (!Quelldatei)
            cout <<"Eingabe Datei kann nicht geoeffnet werden\n";
        else 
        {
            while (Quelldatei.get(c))
            {
                a[i]=c;
                i++;
            }
            for (j=0;j<i;j++)
            {
                cout << a[j];
            }
        }
    

    die Zeilen 1 + 2 kann man zu

    ifstream Quelldatei("neu.txt")
    

    vereinfachen.

    Ab der Zeile 8 liest Du jetzt Zeichen für Zeichen ein. Das ist aber sehr unpraktisch, da Du ja nicht die Zeichen, sondern die Namen benötigst. Besser Du machst

    int nr;
            string sex, name;
            while (Quelldatei >> nr >> sex >> name)
            {
                 // hier jetzt entweder behandeln oder Speichern (struct!)
    

    Gruß
    Werner



  • 😕 😕 ich blicks bald garnimmer 😞



  • Flanders86 schrieb:

    😕 😕 ich blicks bald garnimmer 😞

    .. helfen kann man Dir nur, wenn Du das präzisierst.



  • ja klar, ich hab keine Programmiererfahrung, programmiere seit 3 monaten in der Schule, hab davor noch nie was davon gehört, und gleich so ne Aufgabe usw, ist hart zu realisieren... :p



  • 1. bool nameGefunden==false;
    2. Name eingeben (mit cin)
    3. Datei öffnen (mit ifstream)
    4. while-Schleife: solange die Datei nicht am Ende ist (datei.eof ()!=0) und nameGefunden==false
    4.1. Zeile aus Datei auslesen (string zeile; datei>>zeile;)
    4.2. Zeile auseinanderschnippeln, so daß Du ID, Anrede und Name als jeweils eigene Stringvariable hast
    4.3. Wenn der eingegebene Name gleich der Name aus dem String ist:
    4.3.1. Anrede ausgeben (bzw.: wenn Geschlecht gleich männlich, dann Ausgabe "Herr", ansonsten "Frau")
    4.3.2. nameGefunden=true
    5. datei.close ();

    Die Variante find ich ziemlich gut, aber da weiß ich auch nicht, wie ich anfangen soll, bzw, was ich mit den Angaben machen soll 😞 , vorallem hab noch bis Freitag zeit 😮



  • Hier mal ein Ansatz, ich glaub dein Problem ist es die Codefetzen hier zu verstehen und in dein Programm einzuarbeiten:

    #include <fstream>
    #include <iostream>
    
    int main() 
    {
      std::ifstream in( "deine_datei.endung" );
    
      if( !in )
      {
         std::cout << "Konnte die Datei nicht öffnen!";
         return 1;
      }
    
      int zeile;
      String geschlecht;
      String name;
    
      while( in >> zeile >> geschlecht >> name )
      {
        std::cout << zeile << " " << geschlecht << " " << name << "\n";
      }
    }
    

    Ich denke die Variablennamen sprechen für sich und wie man zwei Strings vergleicht weißt du ja, den Vergleich innerhalb der Einlese-While-Schleife bleibt dir also als Übung überlassen.



  • Hey vielen Dank, aber das check ich genauso wenig wie alles andere 😃 ,
    langsam fass ich mir aufn Kopf lol


Anmelden zum Antworten