Problem bei Einlesen von Datei

Hi und Willkommen bei tutorials.de :)

Der Code hat ja irgendwie nicht viel mit der Aufgbe zu tun ;-]
Du öffnest die gleiche Datei zweimal, liest 10 Buchstaben ein...

Das Grundgerüst passt ja schon mal.
C++:
#include <stdio.h>

int main()
{
    FILE *f;

    f = fopen("zahlen.txt", "r");
    if(f == NULL)
    {
        printf("Datei konnte nicht geoeffnet werden");
        return 1;
    }

    fclose(f);

    return 0;
}
Gehen wir der Reihe nach vor, weil du hast anscheinend einige Verständnisprobleme.
Fragen zum Code oben? Irgendwelche?

Eine ordentliche Zeileneinrückung hilft übrigens beim Code-lesen.
Und die Farbe bringt man rein, indem man cpp statt code in den [] nimmt (hier im Forum).

Gruß
 
JA ich habe in dem Code halt immer rumprobiert um zu gucken was man damit machen kann .
Der Code ist mir soweit klar. Datei wird geöffnet solange, das funktioniert macht er nix ansonsten gibt er Datei... werden aus. der file wird wieder gesschlossen
1. Frage wie kann ich die zahl aus der Txt datei auslesen und dann als integer verwenden ?
Bin halt blutiger anfänger hab mich aber versucht durch verschiedene Tutorials zu kämpfen aber so ganz hats noch nicht klick gemacht :/
 
Zuletzt bearbeitet:
Dazu wollt ich grad kommen :D

Du verwendest immer %c im Code.
Das ist für Einzel-Buchstaben.
Keine ganzen Sätze und schon gar keine int-Zahlen.

Für int ist %d gedacht (wie man übrigens in der Doku nachlesen kann).

Weiters gibt scanf die ANzahl der erfolgreich eingelesenen Variablen zurück.
Wenn als ein %d eingelesen werden soll, muss 1 zurückgegeben werden.
Sonst ist ein Fehler aufgetreten, zB. die Datei hat keinen Inhalt
oder es waren Buchstaben, wo eine Zahl sein sollte.

In der ersten Dateizeile steht also eine einzelne Zahl, die für das Programm ziemlich wichtig ist.
Wenn die nicht eingelesen werden konnte mcht es keinen Sinn, weiterzumachen: Programmende.

C++:
#include <stdio.h>
 
int main()
{
    FILE *f;
    int hauptzahl;
 
    f = fopen("zahlen.txt", "r");
    if(f == NULL)
    {
        printf("Datei konnte nicht geoeffnet werden");
        return 1;
    }
 
    if(1 != fscanf(f, "%d", &hauptzahl))
    {
        printf("Einlesefehler");
        return 2;
    }

    fclose(f);
 
    return 0;
}

Warum return 2?
Wenn ein Programm Fehlerfrei durchläuft, soll es 0 zurückgeben, sonst was anderes.
Wenn man da dann auch noch verschiedene Zahlen nimmt,
kann der Aufrufende an der Zahl erkennen, welcher Fehler aufgetreten ist.

Bis hierher klar?
 
Wird der eingelesen integer dann in Hauptzahl gespeichert ? und liest fscanf das ganze Programme oder nur eine zeile ? Bei meiner sache stand /n hinter dem %c heißt das also es wird nur eine Zeile ausgelesen ? ..

Hatte das garnicht beachtet mit dem %c das macht natürlich sinn -- dachte aber schon weil in zeile 2 ja dann ein * stehen soll dass man iwie chars einlesen muss und die umwandeln .

Sonst soweit klar . DANKE !!
 
Ja, der int wird in hauptzahl gespeichert.
Wieviel fscanf einliest hängt vom %... ab. Bei %d maximal eine Zeile.
%c liest keine ganze Zeile ein, sondern nur einen einsamen Buchstaben.

Und wegen dem * in den folgenden Zeilen:
Der ist zwar da; interessant für dich sind ja aber nur die beiden Zahlen vorne und hinten.
In dem Fall musst du den * gar nicht einlesen, sondern nur scanf beim Zahlen-einlesen sagen,
dass da einer dazwischen zu erwarten ist.

Rest kommt gleich noch hierher...

edit:
Deine Aufgabe sagt jetzt also:
Alle Mal-Rechnungen darunter müssen ausmultipliziert werden, und dann die Ergebnisse addieren.
Das Endergebnis soll die hauptzahl ergeben.

In dem Fall wird zuerst einmal eine Variable summe gemacht, sowie zahl1 und zahl2.
zahl1 und zahl2 werden immer die zwei Zahlen pro Zeile sein,
die dann multipliziert und zu summe addiert werden.

Da braucht man eine Schleife, in der man solange einlesen kann, bis die Datei aus ist:
C++:
while(!feof(f))
{
}
(Komplettcode kommt unten nochmal)

Die Dateizeilen, die jetzt kommen werden, haben alle zuerst eine Zahl,
dann das *-Zeichen, dann wieder eine Zahl.
Wenn da eine Zeile aus der Reihe tanzt ist das kein Grund, das Programm zu beenden,
sondern man kann die Zeile einfach ignorieren.
dH: Man liest ja pro Zeile zwei ints ein. Wenn fscanf nicht 2 zurückgibt ist die Zeile ungültig
und wird nicht zu summe dazugerechnet.

C++:
summe = 0;
while(!feof(f))
{
    if(2 == fscanf(f, "%d*%d", &zahl1, &zahl2))
        summe += (zahl1 * zahl2);
}

...So, das wars dann eigentlich. Mehr ist nicht mehr zu machen.

Komplettcode:
C++:
#include <stdio.h>
 
int main()
{
    FILE *f;
    int hauptzahl, summe, zahl1, zahl2;
 
    f = fopen("zahlen.txt", "r");
    if(f == NULL)
    {
        printf("Datei konnte nicht geoeffnet werden");
        return 1;
    }
 
    if(1 != fscanf(f, "%d", &hauptzahl))
    {
        printf("Einlesefehler");
        return 2;
    }

    summe = 0;
    while(!feof(f))
    {
        if(2 == fscanf(f, "%d*%d", &zahl1, &zahl2))
            summe += (zahl1 * zahl2);
    }

    fclose(f);
    return 0;
}

Fragen immer gern gesehen :)

Gruß
 
aha bin ich ja mal gespannt wie das geht mit dem scanf das mitzuteilen .. hammer vielen dank für die HIlfe !! ich muss sagen es war ganz klar mein riesen Fehler einfach aus tutorials code zu kopieren ohne ihn wirklich komplett verstanden zu haben :)
 
Jo, das mit dem * sollte vllt. etwas ausführlicher sein...
Alles, was bei scanf drinsteht und kein %... ist, wird dort fix erwartet.
Mit "%d" liest man eine Zahl ein

Mit "%dabc%d" liest man ein %d ein, nach dem abc kommen muss, dann noch ein %d.
Wenn da kein abc war, wird nicht 2 zurückgegeben (für 2 %d), also Fehler.

Und mit "%d*%d" muss eben ein * dazwischen sein.
scanf weiss, dass die zweite Zahl erst danach beginnt,
und prüft gleichzeitig, ob wohl der * da ist, und nichts anderes.

Rest ist im oberen Beitrag, falls du es noch nicht gesehen hast.

Gruß

PS: Bitte Netiquette §15 beachten.
Auf korrektes Deutsch (inkl. Groß-/Kleinschreibung) wird hier viel Wert gelegt.
 
DAnke danke muss das jetzt mal alles austesten und mit rumspielen schon mal vielen Dank !!

edit: So sieht jetzt das komplette Programm aus . Habs nicht ganz hinbekommen auch die erste Zeile mit auslesen zu lassen weil der sobald er die erste ausgelesen hat gleich komplett aufgegeben hat und nichts weiter gemacht. Daher hab ich das so gelöst mit nem 2 Aufruf der Datei . Geht das auch anders ?

Und letze Frage - Wie kann man dir nen Kasten Bier zu kommen lassen ? Hast mir super geholfen ;) ! VIELEN DANK !:D



C++:
#include <stdio.h>

int main()
{
    FILE *f;
    FILE *ft;
    int hauptzahl, summe,zahl, zahl1, zahl2,zahl3;

    f = fopen("zahlen.txt", "r");
    ft = fopen("zahlen.txt","r");
    if(f == NULL)
    {
        printf("Datei konnte nicht geoeffnet werden");
        return 1;
    }

    if(1 != fscanf(f, "%d", &hauptzahl))
    {
        printf("Einlesefehler");
        return 2;
    }


    summe = 0;
    while(!feof(f))
    {
            if(2 == fscanf(f, "%d*%d", &zahl1, &zahl2))
            summe += (zahl1 * zahl2);

    }

    printf("Die Summe ist %d\n",summe);

    fscanf (ft, "%d", &zahl);
    printf( "Zahl ist %d \n", zahl);
        if(ft == NULL)
    {
        printf("Datei konnte nicht geoeffnet werden");
        return 1;
    }

    if(1 != fscanf(ft, "%d", &hauptzahl))
    {
        printf("Einlesefehler");
        return 2;
    }
    if (zahl > summe)
        {
            printf("Summe ist kleiner als die Produkte");
        }
    if (zahl < summe)
    {
            printf("Summe ist groesser als die Produkte");

    }
        if (zahl == summe)
    {
            printf("Summe ist gleich gross wie die Produkte");

    }

    fclose(f);
    fclose(ft);
    return 0;
}
 
:eek: Die Ausgabe am Schluss...die hab ich doch glatt vergessen.
Aber wegen dem zweiten Öffnen: Hab mein Programm nicht getestet, sollte aber scho ohne Änderungen gehen. Werds jetzt testen...

edit:
Bei mir funktionierts ohne Änderungen.
Hab nur noch eine Ausgabe am Schluss eingefügt, ob die Zahlen gleich sind:
C++:
#include <stdio.h>
 
int main()
{
    FILE *f;
    int hauptzahl, summe, zahl1, zahl2;
 
    f = fopen("zahlen.txt", "r");
    if(f == NULL)
    {
        printf("Datei konnte nicht geoeffnet werden");
        return 1;
    }
 
    if(1 != fscanf(f, "%d", &hauptzahl))
    {
        printf("Einlesefehler");
        return 2;
    }
 
    summe = 0;
    while(!feof(f))
    {
        if(2 == fscanf(f, "%d*%d", &zahl1, &zahl2))
            summe += (zahl1 * zahl2);
    }

	if(hauptzahl == summe)
		printf("OK\n");
	else
		printf("Nicht gleich\n");
 
    fclose(f);
    return 0;
}

Die zahlen.txt:
Code:
100
5*5
5*15
 
Zurück