Werte aus einer .txt Datei einlesen und aufsummieren
-
Hallo Leute,
ich hoffe ich bin hier im richtigen Unterforum für mein Problem. Mein zweiter Versuch wäre unter Dos gewesen.
Wie bereits in der Überschrift steht, möchte ich ein Programm schreiben, das Zahlen, die in einer .txt Datei stehen und durch Leerzeichen getrennt sind, einliest und anschließend aufsummiert. Mein Wissen über die Programmiersprache ist noch relativ begrenzt, wie man an Aufgabenstellung und sicher auch am Code erkennen kann.
Mein Programm sieht folgendermaßen aus:
#include <stdio.h>
#include <stdlib.h>void main()
{
int *ptr;
int sum=0;
FILE *strahl;
char dateiname[67];
int stelle;
if ((strahl = fopen("Zahlen.txt","r")) == NULL)
{
printf("\nFehler beim Öffnen!");
exit(1);
}stelle=fgetc(strahl);
while(!feof(strahl)) //Solange Ende nicht erreicht
{
putchar(stelle);
sum+=stelle;
stelle=fgetc(strahl);
}
fclose(strahl);
printf("\nDie Summe beträgt %i.",sum);
}Selbstverständlich existiert die Datei Zahlen.txt und putchar(stelle) gibt auch die richtigen Zahlen aus.
Die Summe wird allerdings falsch angegeben.
Ich habe schon verschiedene Kombinationen ausprobiert, um mir einen Überblick zu schaffen, welche Zahlen er addiert.
Zum Beispiel:
#include <stdio.h>
#include <stdlib.h>void main()
{
int *ptr;
int sum=0;
FILE *strahl;
char dateiname[67];
int stelle;
if ((strahl = fopen("Zahlen.txt","r")) == NULL)
{
printf("\nFehler beim Öffnen!");
exit(1);
}stelle=fgetc(strahl);
while(!feof(strahl)) //Solange Ende nicht erreicht
{
putchar(stelle);
printf("\n%i\n",stelle);
sum+=stelle;
stelle=fgetc(strahl);
}
fclose(strahl);
printf("\nDie Summe beträgt %i.",sum);
}Hier ist nur der markierte Teil verändert. Ich erhalte als Ausgabe:
1
4932
3
5132
5
5332
7
5532
9
57Die Summe betrõgt 393. Drücken Sie eine beliebige Taste . . .
Die 1-9 gibt der Befehl putchar aus. Wo die 32 und die 49-57 herkommen weiß ich nicht, zumal ich ja auch nur 2 Ausgabebefehle (putchar und printf) habe, aber ich 3 Werte erhalte.
Ich hoffe ihr könnt mir weiterhelfen.
MfG
Björn
-
Bitte benutze die cpp-Tags, dann kann man deinen Code auch vernünftig lesen. Links unter den Smileys.
Du liest mit fgetc (file-get-character) Zeichen ein, keine Zahlenwerte. Du suchst wahrscheinlich fscanf (file-scan-formatted).
-
Ok, werde ich von jetzt an machen.
#include <stdio.h> #include <stdlib.h> void main() { int sum=0; FILE *strahl; char dateiname[67]; int stelle; // printf("\nWelche Datei wollen Sie lesen?"); // gets(dateiname); if ((strahl = fopen("Zahlen.txt","r")) == NULL) { printf("\nFehler beim Öffnen!"); exit(1); } stelle=fgetc(strahl); while(!feof(strahl)) //Solange Ende nicht erreicht { putchar(stelle); sum+=stelle; stelle=fgetc(strahl); } fclose(strahl); printf("\nDie Summe beträgt %i.",sum); }
Es müsste ja auch so gehen. Ich habe jetzt zumindest den einen Zahlenwert verstanden.
stelle=fgetc(strahl);
schreibt in eine int Variable den ASCI Wert.
putchar(stelle);
"Übersetzt" den richtig.
sum+=stelle;
rechnet allerdings mit der ASCI-Darstellung. Deswegen passt die Summe nicht. Am einfachsten müsste dann doch eine Zuweisung sein. Zum Bsp:
int hilf=atoi(stelle)
hier kommt allerdings: "Error:Das Argument vom Typ ""int"" ist mit dem Parameter vom Typ ""const char *"" inkompatibel."
Wenn ich den Typ von stelle auf char änder, funktioniert es auch nicht.
Wie kann ich denn in C eine solche Zuweisung realisieren?
MfG
Björn
-
Hast du meine Antwort gelesen? Waren doch nur zwei Sätze. Der letzte scheint total an dir vorbei gegangen zu sein.
-
putchar(stelle);
gibt zeichen auf stdout (meist der Bildschirm) aus.
atoi(stelle);
heißt zwar Ascii TO Int, erwartet aber als Argument den Zeiger auf eine Zeichenkette (einen String). Das ist etwas anderes als ein Zeichen.Da dein Wissen begrenzt ist, solltest du nicht versuchen die tollen Sachen von C neu zu erfinden.
Den scanf liest die Zahlenwerte ein und trennt an Whitespaces (Leerzeichen, Tabulatoren und Zeilenende/vorschub).
Wenn du das selber machen möchtest, hast du mehr zu tun.
-
Doch ich habe es gelesen. Problem ist nur, dass ich mal wieder maßlos überfordert war und die letzten 1.5h versucht habe die Beschreibung von fscanf zu verstehen...
spricht nicht für mich, ich weiß. aber da kann man nichts machen.
könnt ihr mir jetzt vielleicht noch sagen, wo der Unterschied zu vorher liegt, dass das Programm die letzte Zahl nicht mehr einliest? Vorher hat er die letzte Zahl noch eingelesen...
#include <stdio.h> #include <stdlib.h> void main() { int sum=0; FILE *strahl; char dateiname[67]; int stelle; int hilf; // printf("\nWelche Datei wollen Sie lesen?"); // gets(dateiname); if ((strahl = fopen("Zahlen.txt","r")) == NULL) { printf("\nFehler beim Öffnen!"); exit(1); } fscanf(strahl,"%i",&hilf); // verändert while(!feof(strahl)) //Solange Ende nicht erreicht { // putchar(stelle); entfernt sum+=hilf; fscanf(strahl,"%i",&hilf); // verändert } fclose(strahl); printf("\nDie Summe beträgt %i.",sum); }
-
Die letzte Zahl wird schon noch eingelesen. Du addierst sie nur nicht mehr zu deiner Summe.
Es gibt noch andere Schleifen. Evtl. ist eine davon besser geeignet. Z.B. die do-while Schleife.
-
die funkion fscanf liefert dir einen rückgabewert, den solltest du prüfen, um keinen schrott zu addieren
-
die funkion fscanf liefert dir einen rückgabewert, den solltest du prüfen, um keinen schrott zu addieren
-
Alles klar,
vielen Dank euch allen.
MfG
Björn