Datei verwaltung



  • mahlzeit.

    ich hoffe ihr könnt mir bei folgendem problem helfen:

    ich habe in einer datei mehrere wörter gespeichert. jetzt möchte ich per zufallsprinzip eines der wörter, die da drin liegen aufrufen und in einem char speichern.

    klingt einfach, aber ich komm nicht drauf.

    danke schon mal



  • Denker schrieb:

    ich habe in einer datei mehrere wörter gespeichert. jetzt möchte ich per zufallsprinzip eines der wörter, die da drin liegen aufrufen und in einem char speichern.

    Wenn die Datei relativ klein ist, dann kannst du sie ja komplett in den speicher laden und in einem array die worte speichern.

    wenn es eine große datei ist, musst du einmal zählen wieviel wörter in der datei sind und kannst dir dann ja den offset merken. um so schnell hinzu'seeken'.



  • naja die datei fasst schon so 100 wörter.

    Shade Of Mine schrieb:

    wenn es eine große datei ist, musst du einmal zählen wieviel wörter in der datei sind und kannst dir dann ja den offset merken. um so schnell hinzu'seeken'.

    wie geht das? 🙂



  • du zaehlst wieviele woerter in der datei sind: zb 200
    danach ermittelst du eine Zufahlszahl zwischen 1-200

    jetzt "springst" du mit der Funktion fseek bis zu dieser Zufallszahl (vom Beginn der Datei aus natuerlich, darum offset) und lest das entsprechende Wort ein..



  • Denker schrieb:

    naja die datei fasst schon so 100 wörter.

    Das fällt imho eher unter kleine datei. Ich weiss ja nicht was für wörter das sind, aber angenommen die haben im Durchschnitt 10 Buchstaben, dann macht das pro Wort 10 Byte, also 1kB. Da würde ich mir mehrere Zugriffe auf die Platte tunlichst vermeiden.



  • leo aka qsch schrieb:

    du zaehlst wieviele woerter in der datei sind: zb 200
    danach ermittelst du eine Zufahlszahl zwischen 1-200

    jetzt "springst" du mit der Funktion fseek bis zu dieser Zufallszahl (vom Beginn der Datei aus natuerlich, darum offset) und lest das entsprechende Wort ein..

    vielleicht bin ich ja übermüdet, aber kannst du mir vielleicht ein beispielcode schreiben? irgendwas kleines.
    danake schon mal



  • proHauptSpeicher schrieb:

    Denker schrieb:

    naja die datei fasst schon so 100 wörter.

    Das fällt imho eher unter kleine datei. Ich weiss ja nicht was für wörter das sind, aber angenommen die haben im Durchschnitt 10 Buchstaben, dann macht das pro Wort 10 Byte, also 1kB. Da würde ich mir mehrere Zugriffe auf die Platte tunlichst vermeiden.

    ja und wie mache ich das? 😕

    ich hab schwierigkeiten damit die einzelnen wörter zu trennen. wie mach ich das?



  • schau dir die funktin fseek an und versuch es erstmal selbst,
    poste deine code dann helf ich dir weiter



  • @ Denker

    Wie sieht deine Datein den genau aus? Sprich, wie sind sind die Wörter voneinander getrennt?



  • im moment ist jedes wort in einer Zeile, weil ich dachte, dass ich da irgendwie mit zeilen arbeiten kann. das kann ich aber auch nach belieben ändern.

    also es soll ein galgenmännchen spiel werden ^^.
    vielleicht kennt der eine oder andere das ja noch aus der grundschulzeit 😋

    ich bin in der spielfunktion jetzt so weit:

    void spielen(void)
    {
        FILE *datei;
        char wort[50];
        int laenge = 0, i;
    
        datei = fopen("WorteDB.txt", "r");
        fscanf(datei,"%s", wort);
    
        laenge = strlen(wort);
        printf("\n\n");
        for(i = 0; i < strlen(wort); i++)
        {
            printf(" _"); 
        }
    
        printf("\n\n");
        system("pause"); // <-- nicht hauen, ist ja nicht von dauer :)
    }// spielen
    

    logischerweise soll das programm immer nur ein beliebiges wort aus der datei holen.
    eigentlich wollte ich das so machen, dass er (per zufall) sich eine Zeile wählt und das darin stehende wort ausliest.
    hat bei mir nur leider nicht geklappt



  • Denker schrieb:

    naja die datei fasst schon so 100 wörter.

    100 wörter sind nicht viel.
    viel wären ein paar MB

    wenn du es wirklich kompliziert machen willst:
    öffne die datei mit fopen()
    such das trennzeichen, zB \n zwischen den worten.

    lade immer 1024 byte in den speicher (oder auch mehr oder weniger, muss man testen was am besten ist), zähle die \n und merk dir die stellen in einem array.

    mach das bis du die ganze datei durchhast.

    wenn du nun das 2. Wort auslesen willst, schaust du in dein array und liest alle zeichen zwischen dem
    array[1]ten und dem array[2]ten zeichen 🙂

    ich würde dir aber dazu raten, die ganze datei einzulesen und jedes wort im speicher in einem char** zu halten.

    dafür brauchst du malloc/realloc sowie free für die dynamische speicherverwaltung. und dann immer ein wort in das array kopieren (vorher speicher reservieren). dann kannst du bequem per arr[1] auf das 2. wort zugreifen.

    idealerweise kopiert man natürlich nicht, weil man die datei einfach in den speicher mappt und sich nur zeiger auf die worte merkt.

    einfacher würde es gehen, wenn du einfach jedesmal die datei durchläufst. am anfang einmal die worte zählen, und dann jedesmal wenn du ein wort willst die datei durchlaufen und das wort rauslesen.
    das wäre das einfachste und natürlich auch schlechteste - deinen anforderungen würde es aber genügen.



  • Shade Of Mine schrieb:

    einfacher würde es gehen, wenn du einfach jedesmal die datei durchläufst. am anfang einmal die worte zählen, und dann jedesmal wenn du ein wort willst die datei durchlaufen und das wort rauslesen.
    das wäre das einfachste und natürlich auch schlechteste - deinen anforderungen würde es aber genügen.

    jap so wollt ich das ja auch machen, nur wie geht das?
    wenn bei mir in der datei jetzt steht:

    katze
    muelltonne
    garten
    kerzenständer
    

    wie kann ich da das wort garten rauslesen? ich pack das irgendwie nicht



  • hmmm kann mir da keiner helfen?



  • Denker schrieb:

    wie kann ich da das wort garten rauslesen? ich pack das irgendwie nicht

    Oh, das ist einfach:
    fgets() liefert dir immer nur eine Zeile.



  • und wie leg ich fest, welche?



  • also bei mir ist es immer einfach nur die erste? was ist wenn ich, sagen wir mal die 3. ausgelesen haben möchte?



  • Einfach fgets() dreimal aufrufen.


Anmelden zum Antworten