Zahlen Einlesen aus Datei in ein int-Array



  • Hallo Leutz,

    zu meinem Problem:
    Ich möchte Zahlen aus einer Datei einlesen in ein int-array und mit diesen Zahlen rechnen.
    Meine Aufgabe besteht darin, aus 9 (gleichartigen) Kugeln in zweimaligen Wiegen die schwere herauszufinden.
    Vorab eine Frage: Ist die Lösung mit einem int-Array ok?

    Als erstes funktioniert schon mal das Einlesen nicht. Schauts euch mal an!

    #include <stdio.h>
    int main() {

    FILE *datei;
    datei=fopen("daten.txt", "r");
    fflush(datei);
    if (datei==NULL) {
    printf("Kann Datei nicht oeffnen.\n");
    }

    int groesse = 9;
    int c[groesse];
    int i=0;
    while ((c[i]=fgetc(datei)) != EOF){
    /*Zum Test, ob die Zahlen richtig eingelesen werden.*/
    fputc(c[i++],stdout);
    }
    fclose(datei);
    return 0;
    }

    Gruß



    Da du die Datei nur mit "r" öffnest, geh ich mal davon aus, dass
    es sich nicht um Binär-, sondern um normale Textdateien handelt.

    Mit fgetc() liest du immer nur ein einzelnes Zeichen.
    => in deinem Array steht also in jedem Feld ein einzelnes Zeichen
    (genauer: der zugehörige ASCII-Wert)

    Schau dir mal die Funktion fscanf() an.
    Die sollte genau das machen, was du brauchst 😉

    http://www.fh-fulda.de/~klingebiel/c-stdlib/stdio.htm#i_fscanf
    http://www.cplusplus.com/ref/cstdio/fscanf.html

    Wenn du Binärdaten vorliegen hast, würde ich dir fread() empfehlen.

    mfg
    Martin



  • Richtig, es handelt sich um eine ganz normale Txt-Datei.

    Ich weiß, dass mit fgetc() ein einzelnes Zeichen eingelesen wird. Deswegen habe ich es ja in einer while-Schleife probiert, dass er mir die Zahlen in ein Array speichert. Im grundegenommen funktioniert das auch irgendwie, nur beim Ausführen kommt eine Meldung von Windows, dass es Probleme gibt.Und ich sehe die Ausgabe in der Eingabeaufforderung.

    Habt ihr darauf einen Tipp?



  • Es wäre schön wenn du die Fehlermeldung hier posten würdest.

    Wofür ist das fflush in einer zum Lesen geöffneten Datei.

    Wie sieht deine Inputdatei aus?
    🙂



  • Meldung in einem Windows-Fenster:
    einlesen.exe hat ein Problem festgestellt und muss beendet werden.

    Problembericht senden. / Nicht senden.

    ok, das fflush() kann ich weglassen. Ich wußte halt nur nicht, wo der Fehler liegt und hatte einiges ausprobiert.

    Die txt-Datei sieht folgendermaßen aus: Es stehen 9 einfache Zahlen unter einander. Inwiefern am Schluss noch etwas stehen muss wie EOF, kann ich nicht sagen. Sagts mir!
    Außerdem gibt er mir nur die ersten 8 Zeichen untereinander aus, die letzte Zahl fehlt und dann kommt wie gesagt, diese Meldung.

    Bitte helft mir! 😕



  • Ich frage mich, warum der Quellcode überhaupt fehlerfrei compiliert werden kann.

    Ist noch keinem aufgefallen, dass da Variablen nicht am Blockanfang deklariert werden (ok, geht mit einem C++-Compiler problemlos) und dass die Größenangabe des Arrays c mit einer Variablen angegeben wird (da sollte der Compiler meckern!)?

    Verwendest du jetzt bereits anstatt fgetc() fscanf()? Der Zeilenumbruch ist übrigens auch ein Zeichen, dass mit fgetc() eingelesen wird. Da du 9 Zeichen untereinander hast (also mit Zeilenumbruch) bekommst du schon mal mindestens 17 Zeichen zusammen. Wenn du das ganze auch noch in einem Windowseditor (wie z. B. notepad) angelegt hast, dann sogar 25 Zeichen (da in Windows ein Zeilenumbruch aus zwei Zeichen besteht). Und das alles heißt, dass dein Array von 9 Zeichen viel zu klein ist und du den berühmten Bufferoverflow hast. Also verwende lieber fscanf() für dein Vorhaben ;).



  • Bau deine Leseschleife mal wie folgt auf.
    - Lesen eines Strings aus der Inputdatei
    - konvertieren der Daten in eine int Zahl und eintragen in das Feld
    - Kontrollausgabe

    char Buffer[100+1];
    while (EOF != fgets(buffer,100,datei)))
    {
    sscanf(buffer,"%i",c[i]);
    /*Zum Test, ob die Zahlen richtig eingelesen werden.*/
    printf("%i\n",c[i]);
    i++;
    }

    so sollte es funktionieren 😃

    Du solltest wirklich auch auf die Konventionen achten in C müssen die Variablen am Anfang eines Blocks definiert sein.

    Deine Schreibweise ist nur in C++ zulässig


Anmelden zum Antworten