2016-04-18 52 views
2

データファイルを取り込み、データファイルのさまざまな値を構造体のグローバル配列に割り当てる単純な関数を作成しようとしています。しかし、私はかなりうまく動作するようになっている問題を抱えています。私は必要なコードの大部分であると信じているものを書いたが、私のテストラインprintf("time is %d\n", BP[i].time);は単に "Time is 0" 10回、私は彼らがそうであると想像したように、値が構造体配列に割り当てられていないと信じさせてくれました。ファイルから構造体配列へのデータの読み込み(C)

さらに進めるにはどうすればよいですか?

例データファイル(.txt):

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

現在のコード:有効な警告と

#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

これは、デバッガを使用する方法を学ぶのに最適な機会です。関連するすべての変数を調べるコードをステップ実行して、実際に何が起こっているかを確認してください! :-) – alk

+2

この '(filePtr = fopen(fileName、" r ")== NULL)'を2回見てください。ここで何が起こりますか? – alk

+0

最小限のデバッグサポートとして、*ループ内の値を表示することができます。何かが全く読まれないのですか? – alk

答えて

0

はライン変更してみてください。また、ここに私が試してみたものです

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

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

にし、動作しているようです私がやったテストに基づいて

#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

ええええええええええええええええええええええええええええええええええええええええええと - 結局のところ、while文ではなくif文の中に括弧のエラーがありました。あなたのコード: 'if(filePtr = fopen(fileName、" r ")== NULL)' vs my code: 'if(filePtr = fopen(fileName、" r ")== NULL)' – MomoDevi

+0

心配しないでくださいそれについてあまりにも多く、それは私に数回も起こった:D – sk1984

1

コンパイル。

[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() 
^ 

これで十分ではありませんか?それは私のためだった! :)

+1

これはコメントだったはずですが、明らかに長すぎます。だから1 +を取得します。 ;-) – alk

+1

教訓:コンパイラの警告レベルを最大に押し上げ、警告が発行されなくなるまでコードを修正します。まだ問題が残っている場合は、ここに戻ってください。 – alk

+1

正直言って、私はあなたのコメントを示して、私はあなたにそれを残すべきだと思っています。しかし、私はコンパイラがあなたのコメントについて何を言っているのかを示し、それをコメントとして投稿できると思った。それはむしろ広範な質問ですので、OPのデバッグ経験を最大限に楽しむためにgdbと組み合わせる必要があります。 :) – gsamaras

1

私はいくつかの変更を加え、今すぐ実行しました。

#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() 

出力は以下のようになります。

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

あなたは盲目的にここで 'BP [position] .time =(int *)time;のように周囲をキャスティングして警告を修正したくない正しいタイプのスイートに 'struct bloodPressure'のメンバーの定義。現在は、すべてのメンバーを 'int'へのポインタと定義しています。星を取り除くだけで 'int'にすると' int * time'は 'int time'になります。 – alk

+0

@alk私は実際にコードを見たときにそれを考慮していましたが、その後、それらを 'int * time'として必要と思っていました。しかし、アドバイスをいただきありがとうございます。 – Arjun

+0

@alk答えは 'int * time'の代わりに' int time'で編集されました。 – Arjun

関連する問題