Programm soll Gleitkommawerte aus einer Datei lesen.
-
Hallo zusammen,
Ich möchte ein Programm schreiben das aus einer Datei (z.B. punkte.txt) eine unbestimmte Anzahl von Gleitkommawerten ließt und dann den größten und kleinsten Wert ausgibt.
Am meisten Probleme habe ich dabei, eine vorher nicht bekannte Anzahl von Werten aus einer Datei einzulesen.
Vielen dank schon mal im voraus!
Gruß Yannic
-
Ich nehme an, du meinst, dein Problem besteht darin, eine nicht vorhersehbare Anzahl von Werten zu speichern? Brauchst du nicht, nur das aktuelle Maximum und Minumum.
-
sorry ich muss noch was hinzufügen, einmal möchte ich das minimum und das maximum der Zahlen haben und zusätzlich noch den Mittelwert von allen Zahlen.
-
Dann speicherst du halt noch die aktuelle Summe und die gelesene Anzahl, so dass du am Ende den Mittelwert ausrechnen kannst.
-
Dann lies erst einmal die Datei, zeige den Code und sage wo es klemmt.
-
Das Problem ist ich bin noch nicht so erfahren mit c.
Als erstes hab ich die Datei mit "FILE *" geöffnet, jetzt möchte ich mit einer Schleife jeden einzelnen Wert abspeichern und dann ist schon fast ende :D.
-
[code="c"]
#include <stdio.h>int main()
{
FILE *datei;
double x[100];
int i;datei = fopen("punkte.txt","r");
while(fscanf(datei, "%lf", &x) ==1)
{
fscanf(datei,"%lf",&x);
}
fclose(datei);}
-
Du hast kein Problem mit der Datei, sondern mit den Grundlagen von C.
Warum zweimal fscanf?
Wozu brauchst du i, das du nicht benutzt?
Wofür steht der Name (ohne die []) eines Arrays?
-
Ja das ist auch für mich das erste mal das ich aus einer anderen Datei Werte auslesen möchte.
Das war nur mein erster Ansatz und soll nicht das fertige Programm darstellen!
#include <stdio.h>
int main()
{
FILE *datei;
double x;datei = fopen("punkte.txt","r");
fscanf(datei,"%lf",&x);
fclose(datei);
}Wenn das Programm so aussieht speichert das Programm nur den ersten Wert aus der Datei oder?
Also was muss man tuen damit alle Werte egal wie viele es sind gespeichert werden.
Braucht man dazu verschiedene Variablen oder kann man die Werte in einem Feld abspeichern?
-
Ich hab irgendwie schon zweimal gesagt, dass du die Werte nicht speichern muss. In C++ sähe das anders aus, aber in C wirst du es mit deinem Wissen nicht hinkriegen, beliebig viele Werte zu speichern. Also versuch es gar nicht erst.
Einen Wert einlesen kannst du ja schon. Geh folgendermaßen vor:
- Schreibe ein Programm, dass alle Werte einliest und ausgibt, mehr nicht.
- Schreibe ein Programm, dass alle Werte einliest und mitzählt, wieviele es sind, und am Ende die Anzahl ausgibt.
- Löse deine Aufgabe.
-
YG schrieb:
Wenn das Programm so aussieht speichert das Programm nur den ersten Wert aus der Datei oder?
Der erste Wert steht hinterher in der Variablen x.
Also was muss man tuen damit alle Werte egal wie viele es sind gespeichert werden.
Eine Schleife böte sich an. Schleifen hast du schon gehabt, oder?
Braucht man dazu verschiedene Variablen oder kann man die Werte in einem Feld abspeichern?
Das kommt ganz da drauf an, was der Zweck deines Programms ist. Wenn hinterher sämtliche Werte aus der Datei zur weiteren Benutzung zur Verfügung stehen sollen, dann böte sich ein Feld an, ja. Wenn du bloß irgendetwas tun möchtest mit den einzelnen Werten: Nun, dann machst du das eben einfach und brauchst sie nicht zu speichern.
Falls du die Variablen in einem Feld speichern willst/musst: Das wird etwas kompliziert, da du ja nicht im Voraus weißt, wie viele Werte das Feld aufnehmen muss. Das heißt, du musst es bei Bedarf dynamisch vergrößern. Und da in C die manuelle Speicherverwaltung nicht umsonst "manuell" heißt, ist dazu einiges an Code nötig. Das ist schon ein recht fortgeschrittenes Thema, mit dem zu derzeit ziemlich sicher noch überfordert wärst.
Was hast du denn genau vor? Bei sehr vielen Problemen braucht man die Werte nämlich nicht alle zwischen zu speichern, sondern es reicht, sie direkt zu verarbeiten und dann zu verwerfen. Auch wenn man das bei manchen Problemen manchmal nicht direkt sieht.
edit: In deinem ersten Beitrag steht ja schon, dass du das Minimum und das Maximum suchst. Dann brauchst du die Werte gar nicht zwischen zu speichern. Du kannst das Minimum und das Maximum direkt bestimmen, indem du die Werte einfach alle durchgehst und dir das momentane Minumum und Maximum merkst. Wenn du einen kleineren oder größeren Wert findest, ist dieser das neue Minimum/Maximum.
-
Genau da liegt ja das Problem wie ließt man alle Werte ein?
-
YG schrieb:
Genau da liegt ja das Problem wie ließt man alle Werte ein?
SeppJ schrieb:
Eine Schleife böte sich an. Schleifen hast du schon gehabt, oder?
Falls nicht: Dann ist das Problem wohl kaum zu lösen. Aber dann hättest du sicher nicht diese Hausaufgabe bekommen.
-
Okay gut abspeichern wird zu kompliziert.
Ich brauch jetzt einfach nochmal einen kleinen Denkanstupser wie man die Werte einließt. Ich würde jetzt hingehen 10 double Variablen festlegen und mit "fscanf", diese alle einzeln einlesen. Doch das funktioniert ja nur, wenn ich weiß wie viele Werte die Datei beinhaltet.
-
YG schrieb:
Ich brauch jetzt einfach nochmal einen kleinen Denkanstupser wie man die Werte einließt.
Dann lies den Thread noch einmal. Du hast bestimmt 5 Mal nicht nur einen kleinen Stupser, sondern einen Wink mit dem Zaunpfahl bekommen, wie das geht. Abgesehen von einer Komplettlösung kann ich nicht mehr Hilfe geben. Und eine Komplettlösung werde ich dir nicht geben.
Ich würde jetzt hingehen 10 double Variablen festlegen und mit "fscanf", diese alle einzeln einlesen.
Totaler Holzweg!
-
YG schrieb:
Doch das funktioniert ja nur, wenn ich weiß wie viele Werte die Datei beinhaltet.
Nein.
Dein erster Ansatz mit der while-Schleife war doch gar nicht schlecht.
Weißt du denn warum da bei while(fscanf(datei, "%lf", &x) ==1) der Vergleich mit 1 steht?
-
Die Schleife läuft jede Zeile der Datei ab, wenn in der Zeile etwas drin steht "kommt die 1 zurück", wenn die Zeile leer ist "kommt eine Null zurück" oder?
-
YG schrieb:
Die Schleife läuft jede Zeile der Datei ab, wenn in der Zeile etwas drin steht "kommt die 1 zurück", wenn die Zeile leer ist "kommt eine Null zurück" oder?
Nein, nicht ganz. scanf interessieren so etwas wie Zeilen nicht. Zumindest nicht, bei dem hier gegebenen Formatstring. Zeilenumbrüche sind auch nur irgendwelche Zeichen in einer Datei, die haben für den Computer keine spezielle Bedeutung (außer man befielt ihm, dass er das nicht so machen soll). Für scanf ist ein Zeilenumbruch standardmäßig bloß ein Trennzeichen wie jedes andere (zum Beispiel Leerzeichen).
Hast du mal in einer Referenz geguckt, was der Rückgabewert von scanf bedeutet?
Hier ist zum Beispiel eine gute Online-Referenz:
www.cplusplus.com
Ist zwar für C++, aber wenn du nur die "C-Library" anguckst, ist dort alles bewusst kompatibel zu C gehalten.
-
Fast.
fscanf gibt die Anzahl der erfolgreich gelesenen Elemente zurück.
Da du nur eins lesen willst kommt beim erfolg die 1 zurück.Jetzt hast du eine Schleife, die Werte einliest, solange welche in der Datei stehen.
Was willst du in der Schleife machen?
Du kannst
- den Wert zum Test ausgeben (printf)
- mitzählen wie oft die Schleife durchlaufen wurde
- ...
Probier mal.(jedenfalls solltest du nicht nochmal Werte mit fscanf einlesen)
-
So ich hab mich heute morgen nochmal in ruhe dran gesetzt. Das Programm funktioniert soweit nur der minimal Wert wird falsch ausgegeben.
Danke nochmal für die Antworten von gestern.#include <stdio.h>
int main()
{
FILE *datei;
double x;
double mittel;
double summe;
double max;
double min;
double anzahl=0;datei= fopen("punkte.txt", "r");
while(fscanf(datei,"%lf",&x) ==1)
{anzahl++;
summe = summe + x;
if(max<x ){
max = x;
}
if(min>x){
min = x;
}}
fclose(datei);
mittel = summe/anzahl;
printf("Maximalwert: %lf\n",max);
printf("Minimalwert: %lf\n",min);
printf("Mittelwert: %lf\n",mittel);return 0;
}