Problem beim Einlesen aus Datei fopen/fscanf
-
Das Programm soll Sensorenwerte aus einer Datei auslesen, die ich vorher mit dem selben Programm gespeichert habe. Um sicherzugehen, dass die Werte ausgelesen werden, habe ich neue Variablen/Pointer für das Auslesen erstellt.
Das Programm liest nun nichts mehr aus dem File aus.
Kann mir jemand helfen(Habe leider unter Suche nichts passendes gefunden!)?Vielen Dank schon mal!
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <math.h> struct sensoren { char name[20]; char nameread[20]; double wert[3]; }; struct sensoren *pSensor; void main (void) { int n = 0; int anz; int i; int j; int brk_value = 1; int men_value; double* pMid; FILE *pFile; char c; double* pMidread; printf("--------------MENUE--------------\n\n"); printf("[1] Eingabe\n"); printf("[2] Ausgabe\n"); printf("[3] Ende\n\n"); while(brk_value) { scanf("%d",&men_value); if(men_value <1 || men_value > 3) { printf("\nBitte waehlen Sie einen der 3 Menuepunkte aus.\n"); } switch(men_value) { case 1: // Eingabe der Daten und speichern in File // Abfrage wie viele Sensoren vorhanden sind printf("\nGeben Sie die Anzahl der Sensoren ein:\t"); scanf("%d", &n); if(n <1) { printf("\nUngueltige Eingabe!"); printf("\n\nBitte geben Sie eine Zahl größer 0 ein!"); printf("\n\nGeben Sie die Anzahl der Sensoren ein:\t"); scanf("%d", &n); } // Speicher reservieren pSensor = (struct sensoren*)calloc(n,sizeof(struct sensoren)); pMid = (double*) calloc (n, sizeof(double)); // Eingabe der Bezeichnungen und der Werte für jeden Sensor for(i = 0; i<n; i++) { printf("Geben Sie den Namen des %d. Sensors ein: \t", i+1); scanf("%s", &pSensor[i].name); // Jeder Sensor hat 3 Werte for(j = 0; j<3; j++) { printf("Geben Sie den %d. Wert des %d. Sensors zwischen -5/+5 V ein:\t", j+1, i+1); scanf("%lf", &pSensor[i].wert[j]); if(pSensor[i].wert[j] <-5 || pSensor[i].wert[j] > 5) { printf("\nUngueltige Eingabe!\n\n"); j--; } } // Mittelwert jedes Senors -> 3 Werte des Sensors / 3 pMid[i] = ((pSensor[i].wert[0] + pSensor[i].wert[1] + pSensor[i].wert[2])/3); printf("\nDer Mittelwert des %d. Sensors ist %lf\n\n",i+1,pMid[i]); } // File schreiben pFile = fopen("Sensor.txt", "w"); for(i = 0; i<n; i++) { fprintf(pFile, "%s\t\t%lf\n", pSensor[i].name, pMid[i]); } fclose(pFile); break; case 2: // Ausgabe der Daten und lesen aus File printf("Werte werden geladen...\n\n"); pFile = fopen("Sensor.txt","r"); if (pFile) { anz = 0; do { c = fgetc(pFile); if (c=='\n') anz++; } while(!feof(pFile)); pSensor = (struct sensoren*)calloc(anz,sizeof(struct sensoren)); pMidread = (double*) calloc (anz, sizeof(double)); i = 0; while(!feof(pFile)) { fscanf(pFile, "%s\t\t%lf", &pSensor[i].nameread, &pMidread[i]); i++; } fclose(pFile); for(i=0; i<anz;i++) { printf("\nDer ausgelesene Wert fuer %s ist %lf.\n", pSensor[i].nameread, pMidread[i]); } } break; case 3: // Programm beenden printf("Das Programm wird geschlossen..."); brk_value = 0; break; default: // ungueltiger Menuepunkt gewaehlt printf("Ungueltige Eingabe!\n\n"); } } free(pMid); free(pMidread); free(pSensor); fflush(stdin); getchar(); }
-
Du speicherst die Daten ja auch gar nicht. Du liest einzelne Zeichen mit fgetc und überschreibst sie im nächsten Durchlauf gleich wieder. Die folgende Schleife mit fscanf ist irrelevant, da EOF bereits erreicht ist.
EDIT: Ach so, mit der ersten Schleife zählst du nur (hier könntest du z.B. auch einen kleinen Datei-Header definieren, der die Anzahl der Sensoren enthält). Springe nach der Zählschleife wieder an den Anfang der Datei (
fseek
), dann klappt es.
-
In Zeile 125 ist ein & zuviel.
Sollte eine Warnung vom Compiler geben. (Wenn nicht, alle Warnungen anschalten)
-
Vielen, vielen Dank!! Funktioniert jetzt genau so wie ich's mir vorgestellt hab!