Zufallsgenerator und Zeilengenaues Auslesen aus einer Datei



  • Hi,
    ich schreibe gerade einen kleinen Vokabeltrainer.
    Ich lese eine Zeile aus einer Datei ein und gebe diese
    aus. Dann lese ich eine Zeile aus einer anderen Datei ein
    und vergleiche diese mit einer eingabe. Mein Ziel ist
    es eine zufällige Zeile einzulesen(bei beiden Dateien die
    selbe)(Ich vergleiche das ergebnis die Zeile der zweiten Datei
    mit der Eingabe.)

    Ich bitte darum das ihr mir keinenCode gebt,
    sondern bitte nur einen Lösungsansatz.
    Das hier habe ich bereits:

    #include <conio.h>
    #include <conio.h>
    #include <string>
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    string ReadGermanLine();
    string ReadLanguageLine();
    
    int main(){
    
    cout << "Tranlate the following words into Enlish"<<endl<<endl;
    
    //Funktionsaufruf
    string ReadG;
           ReadG=ReadGermanLine();
    
    cout <<ReadG<<endl;
    
    //Funktionsaufruf
    string ReadL;
           ReadL=ReadLanguageLine();
    
    //Eingabe
    string InVoc;
    cin >> InVoc;
    
        if(ReadL==InVoc){
        cout << "Richtig"<<endl;
        //PLANUNG:Schreibe in die "RICHTIG" Datei
        }
        else if(ReadL!=InVoc){
        cout << "Falsch"<<endl;
        //PLANUNG:Schreibe in die "FALSCH" Datei
        }
        else{
        //PLANUNG:Schreibe in die "FALSCH" Datei
        cout << "Falsch"<<endl;
        }
    
    getch();
    };
    
    string ReadGermanLine(){
    
    //Einlesung
    ifstream GermanFile;
             GermanFile.open("C:\\Programme\\Vocabelinator\\VokabelnDeutsch.txt");
    
                string Inhalt;
    getline(GermanFile,Inhalt);
    
            GermanFile.close();
    
    return Inhalt;
    
    };
    
    string ReadLanguageLine(){
    
    //Einlesung
     ifstream LanguageFile;
              LanguageFile.open("C:\\Programme\\Vocabelinator\\VokabelnEnglisch.txt");
    
                  string Inhalt;
    getline(LanguageFile,Inhalt);
    
            LanguageFile.close();
    
    return Inhalt;
    
    };
    

    Ich würde also gerne wissen wie ich einen Zufallswert erzeuge(ich glaube
    mit max),(Ich weis da kommt oft Null heraus, aber ich würde mir dann eine
    Schleife schreiben die immer wenn Null heraus kommt einen Neuen Zufallswert berechnet.)Und ich würde gerne wissen wie ich eine bestimmte Zeile einlese,
    da getline ja immer oben anfängt 😞 .

    Vielen dank im voraus.

    PS:Ich habe mal versucht zu Formatieren, ist das so OK?

    [EDIT]Ich habe bei der Such Funktion, zu meinem erstaunen bei beiden nicht wirklich das was ich wollte finden können (bei der Datei einlesung mit getline
    auch nichts) 😞 [EDIT]

    cu max



  • Da Dateien nur forwarditeratoren haben und keinen randomaccess wird es nur mit viel Zeitaufwand machbar sein einen Zugriff auf einen zufälligen Index zu erzeugen. (Du müsstest immer n-1 Zeilen überlesen).

    (Zufallszahlen: srand() rand() als Tip zum nachschlagen)

    Lies die Zeilen doch in einen vector<string> ein. Mit hilfe der Methode at() kannst Du dann über eine Zufallszahl zugreifen. (oder wenn Du dafür sorgst das zufallszahl < vector.size() operator[] ).

    Kostet zwar mehr speicher aber geht schneller 🙂

    Du kannst nun 2 vectoren verwenden oder Dir std::pair zur hilfe nehmen.
    Dann hast [randomzahl] und englisch==deutsch als paar im vector liegen.



  • Wie wäre es, wenn Du die Dateien vorher in den Speicher lädst?
    Wenn Sie da einmal als Feld gespeichert sind, kannst Du ganz einfach über den Index drauf zugreifen.

    Als Stuktur kannst Du einen Vector von Strings nehmen.



  • daishi schrieb:

    Wie wäre es, wenn Du die Dateien vorher in den Speicher lädst?
    Wenn Sie da einmal als Feld gespeichert sind, kannst Du ganz einfach über den Index drauf zugreifen.

    Als Stuktur kannst Du einen Vector von Strings nehmen.

    Knuddlbaer schrieb:

    Lies die Zeilen doch in einen vector<string> ein....).



  • @Knuddlbaer
    T'schuldigung, Dein Posting hatte ich garnicht gelesen. 🙄



  • Schade, dabei stand diesmal was sinnvolles drinne 🤡 🙄

    @Master_Max

    Bist weitergekommen ?



  • Hi,
    sorry ich bin auf DSL umgestiegen und habe mal eine objektorientierte
    version von dem Ding gemacht(zeig ich heute abend).
    Ich meinte eigentlich rand aber bei rand bekomme ich leider immer dieselbe
    Zahl heraus. Bin nicht an meinem Programmmier Pc, ich glaube aber das so
    gemacht zu haben:

    int Zufallswert=rand();
    

    Aber ich bekam immer dieselbe Zahl heraus.

    Naja, ich bin noch nicht wirklich weit und habe leider keine Ahnung von
    vektoren(Zu weihnachten gibt es ein gutes Buch :D)desshalb will ich sie bis
    jetzt nich verwenden. Ich muss jetzt leider schon wieder weg,
    *Weihnachtsgeschenkkauf*
    Danke.

    PS:Gibt es keine Funktion allà: getline(Line Number,Speicherort)?

    Bis heute Abend



  • Nein die Funktion musst Du Dir bauen.

    Nutze mal srand (einmalig) vor rand().



  • Hi,
    hmmm geht trotz srand() immer noch nicht:

    //Random 
    
    #include <conio.h>
    
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    int main(){
    unsigned int Ui;
    srand(Ui);
    int Zufall = rand();
    
    cout<<Zufall<<endl;
    
    getch();
    
    }
    

    Und hier wäre das was ich vor 4 Tagen gepostet habe mit Klassen:

    #include <conio.h>
    
    //STL Headers:
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
        // Class for Data -In and -Out put
        class Streaming
        {
    
        private:
        //The Data-Save Files
        ifstream GermanFile;
        ifstream LanguageFile;
    
        protected:
        //The return Value
        string content;
    
        public:
        //Member function of the streaming class
        string m_ReadGermanLine()
            {
    
                        GermanFile.open("C:\\Programme\\Vocabelinator\\VokabelnDeutsch.txt");
    
                getline(GermanFile,content);
    
                        GermanFile.close();
    
                 return content;
    
            };
    
        //Member fuction of the Streaming Class
        string m_ReadLanguageLine()
            {
    
                          LanguageFile.open("C:\\Programme\\Vocabelinator\\VokabelnEnglisch.txt");
    
                  getline(LanguageFile,content);
    
                          LanguageFile.close();
    
                 return content;
    
            };
     //End of the Streaming class   
    };
    
    //MainFunction
    int main()
    {
    
        cout << "Foit Presents: The Vokabelinator Alpha 0.01 Build 2003"<<endl<<endl;
        cout << "Tranlate the following words into the Language in that your vocabularies are"<<endl<<endl;
    
        //Call the member function 
        string ReadG;
               ReadG=Streaming().m_ReadGermanLine();
        cout <<ReadG<<endl;    
    
        //Call the member function 
        string ReadL;
               ReadL=Streaming().m_ReadLanguageLine();
    
        //Instream
        string InVoc;
        cin >> InVoc;
    
        if(ReadL==InVoc){
        cout << "right"<<endl;
        //PLANING:Write the string into "Right.txt"
        }
        else if(ReadL!=InVoc){
        cout << "wrong"<<endl;
        //PLANING:Write the string into "False.txt"
        }
        else{
        //PLANUNG:Write the string into "False.txt"
        cout << "wrong"<<endl;
        }
    
    getch();
    
    };
    

    Was ist an dem Random siehe oben falsch?
    Ich denke das mit den Vektoren ist noch zu schwer.
    Ich werde erstmal das andere machen.

    Vielen dank im voraus.

    cu max



  • Hi,
    kann mir niemand sagen was an dem Zufallsgenerator falsch ist?

    Vielen dank im voraus.

    cu max



  • Sets a random starting point.

    Routine Required Header
    srand <stdlib.h>

    void srand( unsigned int seed );
    Parameter
    seed
    Seed for random-number generation
    Libraries
    All versions of the C run-time libraries.

    Return Value
    None

    Remarks
    The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.

    Example

    /* RAND.C: This program seeds the random-number generator
    * with the time, then displays 10 random integers.
    */

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>

    void main( void )
    {
    int i;
    /* Seed the random-number generator with current time so that
    the numbers will be different every time we run.
    */
    srand( (unsigned)time( NULL ) );
    /* Display 10 numbers. */
    for( i = 0; i < 10;i++ )
    printf( “ %6d\n”, rand() );
    }
    Output

    6929
    8026
    21987
    30734
    20587
    6699
    22034
    25051
    7988
    10104
    See Also
    rand



  • Hi,
    vielen dank.
    Steht die Erklärung so im Header?
    //dann bin ich ein Vollidiot;)

    cu max


Anmelden zum Antworten