2016-04-18 12 views
2

Ich versuche eine einfache Funktion zu erstellen, die eine Datendatei aufnimmt und verschiedene Werte aus der Datendatei einem globalen Array von Strukturen zuweist. Allerdings habe ich Probleme damit, dass es richtig funktioniert. Ich habe geschrieben, was ich glaube, ist die meisten der benötigten Code, aber meine Testlinie printf("time is %d\n", BP[i].time); liest einfach "Time is 0" 10 Mal, was zu der Annahme führt, dass die Werte nicht dem Struktur-Array zugewiesen werden, wie ich es mir vorgestellt habe.Lesen von Daten aus einer Datei in ein Struktur-Array (C)

Wie kann ich weiter verfahren?

Beispiel-Datendatei (.txt):

0001 553 200 
0002 552 100 
.... ... ... 

Aktuelle Code:

#include <stdio.h> 
#include <stdlib.h> 

// Function Prototype 
void readFileBP(char fileName[1000]); 

// Definition of BP Structure 
struct bloodPressure 
{ 
    int *time; 
    int *sys; 
    int *dia; 
}BP[50]; // end struct BP 

int main() 
{ 
    char fileName[1000] = "C:\\Users\\User\\Desktop\\DataFiles\\BP_1.txt"; 
    readFileBP(fileName); 

    int i = 0; 

    for (i; i<10; i++) 
    { 
     printf("Time is %d\n", BP[i].time); 
    } 
} // end int main() 

void readFileBP(char fileName[1000]) 
{ 
    FILE *filePtr; // declare file pointer 
    int time; 
    int sys; 
    int dia; 
    int position = 0; 


    if (filePtr = fopen(fileName, "r") == NULL) // error check opening file 
    { 
     printf("Opening file failed. Please reenter filename."); 
     exit(1); 
    } // end if 

    while (fscanf(filePtr, "%d, %d, %d", &time, &sys, &dia) != EOF) // read in BP values 
    { 
     BP[position].time = time; 
     BP[position].sys = sys; 
     BP[position].dia = dia; 
     position++; 

    } // end while 

    fclose(filePtr); 



} // end void readFile() 
+0

Dies ist jetzt die perfekte Gelegenheit zu lernen, einen Debugger zu verwenden. Durchlaufen Sie den Code und überprüfen Sie alle relevanten Variablen, um zu sehen, was * wirklich * vor sich geht! :-) – alk

+2

Schauen Sie sich zweimal '(filePtr = fopen (fileName," r ") == NULL)' an. Was passiert hier 1.? – alk

+0

Und als minimale Debugging-Unterstützung möchten Sie die gelesenen Werte * innerhalb * der Schleife ausgeben. Wird überhaupt etwas gelesen? – alk

Antwort

0

versuchen, die Linie zu ändern:

while (fscanf(filePtr, "%d, %d, %d", &time, &sys, &dia) != EOF) 

zu

while (fscanf(filePtr, "%d%d%d", &time, &sys, &dia) != EOF) 

auch hier ist, was ich ausprobiert und es scheint zu funktionieren basierend auf den Tests, die ich getan habe

#include <stdio.h> 
#include <stdlib.h> 

#define MAX_ARRAY_SIZE 50 

typedef struct BloodPressure 
{ 
    int time; 
    int sys; 
    int dia; 
}BloodPressure; 

BloodPressure bloodPressure[MAX_ARRAY_SIZE]; 

void ReadFile(char *fileName); 

int main(int argc, char *argv[]) 
{ 
    char *fileName = "BP_1.txt"; 

    ReadFile(fileName); 

    int i = 0; 

    for (i = 0; i < MAX_ARRAY_SIZE; i++) 
    { 
     printf("Dia is : %d\n", bloodPressure[i].dia); 
     printf("Sys is : %d\n", bloodPressure[i].sys); 
     printf("Time is : %d\n", bloodPressure[i].time); 
     printf("\n"); 
    } 

    exit(EXIT_SUCCESS); 
} 

void ReadFile(char *fileName) 
{ 
    FILE *filePtr = NULL; 
    int i = 0; 

    if ((filePtr = fopen(fileName, "r")) == NULL) 
    { 
     printf("Error : Unable to open %s for reading\n"); 
     exit(EXIT_FAILURE); 
    } 

    while (fscanf(filePtr, "%d%d%d", &bloodPressure[i].dia, &bloodPressure[i].sys, &bloodPressure[i].time) != EOF) 
    { 
     i++; 
    } 

    fclose(filePtr); 
} 
+0

Ja - ich hatte schließlich einen Klammerfehler (in der if-Anweisung, nicht die while-Anweisung). Dein Code: 'if ((filePtr = fopen (Dateiname," r ")) == NULL)' vs mein Code: 'if (DateiPtr = fopen (Dateiname," r ") == NULL)' – MomoDevi

+0

mach dir keine Sorgen darüber zu viel, das ist mir auch ein paar mal passiert: D – sk1984

1

Compile sind mit Warnungen. Sie sollten etwas wie das bekommen:

[email protected]:~$ gcc -Wall -o px px.c 
px.c: In function ‘main’: 
px.c:22:5: warning: statement with no effect [-Wunused-value] 
    for (i; i<10; i++) 
    ^
px.c:24:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=] 
     printf("Time is %d\n", BP[i].time); 
     ^
px.c: In function ‘readFileBP’: 
px.c:37:17: warning: assignment makes pointer from integer without a cast [enabled by default] 
    if (filePtr = fopen(fileName, "r") == NULL) // error check opening file 
       ^
px.c:37:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses] 
    if (filePtr = fopen(fileName, "r") == NULL) // error check opening file 
    ^
px.c:45:27: warning: assignment makes pointer from integer without a cast [enabled by default] 
     BP[position].time = time; 
         ^
px.c:46:26: warning: assignment makes pointer from integer without a cast [enabled by default] 
     BP[position].sys = sys; 
         ^
px.c:47:26: warning: assignment makes pointer from integer without a cast [enabled by default] 
     BP[position].dia = dia; 
         ^
px.c: In function ‘main’: 
px.c:26:1: warning: control reaches end of non-void function [-Wreturn-type] 
} // end int main() 
^ 

Ist das nicht genug, um Sie zu beginnen? Es war für mich! :)

+1

Das hätte ein Kommentar sein sollen, ist aber offensichtlich zu lang für einen. Also nimm eine 1+. ;-) – alk

+1

Erkenntnisse: Schieben Sie die Warnstufe des Compilers bis zum Maximum nach oben und korrigieren Sie den Code, bis keine weiteren Warnungen mehr ausgegeben werden. Wenn es immer noch Probleme gibt, komm zurück ... – alk

+1

@alk um ehrlich zu sein Ich zeige deine Kommentare und dachte ich sollte es dir überlassen. Aber dann dachte ich, ich könnte zeigen, was der Compiler über deinen Kommentar zu sagen hat und poste das als Kommentar. Stellt sich heraus, es ist eine ziemlich breite Frage, so denke ich, dass die Debugging-Erfahrung für OP auslösen sollte, kombiniert mit gdb für maximalen Genuss! :) – gsamaras

1

Ich machte einige Änderungen und lief es gerade jetzt.

#include <stdio.h> 
    #include <stdlib.h> 

// Function Prototype 
void readFileBP(char fileName[1000]); 

// Definition of BP Structure 
struct bloodPressure 
{ 
    int time; 
    int sys; 
    int dia; 
}; // end struct BP 
struct bloodPressure BP[50]; 

int main() 
{ 
    char *fileName = "file.txt"; 
    readFileBP(fileName); 
    int i = 0; 
    for (i; i<10; i++) 
    { 
     printf("Time is %d\n", BP[i].time); 
    } 
    getch(); 
} 

void readFileBP(char fileName[1000]) 
{ 
    FILE *filePtr; // declare file pointer 
    int time=0; 
    int sys=0; 
    int dia=0; 
    int position = 0; 
    filePtr= fopen(fileName,"r"); 
    while (fscanf(filePtr, "%d, %d, %d", &time, &sys, &dia) != EOF) // read in BP values 
    { 
     BP[position].time = time; 
     BP[position].sys = sys; 
     BP[position].dia = dia; 
     position++; 

    } // end while 

    fclose(filePtr); 
} // end void readFile() 

Der Ausgang ist jetzt:

Time is 1 
Time is 553 
Time is 200 
Time is 2 
Time is 552 
Time is 100 
Time is 0 
Time is 0 
Time is 0 
Time is 0 
+0

Sie möchten keine Warnungen durch blinde Castings wie hier 'BP [position] .time = (int *) time; die Definitionen von 'struct blutdruck'-Mitgliedern, um dem richtigen Typ zu entsprechen.Derzeit definiert es alle seine Mitglieder als einen Zeiger auf "int", was Sie nicht zu wollen scheinen. Machen Sie sie einfach "int", indem Sie den Stern entfernen, so dass "int * time" zu "int time" wird. – alk

+0

@alk Ich dachte eigentlich darüber nach, als ich den Code zum ersten Mal gesehen habe, aber dann dachte ich, dass sie es als "int * time" verlangten. Aber danke für den Hinweis .. kein Blind Casting mehr. – Arjun

+0

@alk Die Antwort wurde jetzt mit 'int time' anstelle von' int * time' bearbeitet. – Arjun