2017-10-19 21 views
0

私は文字列int、doubleを含むテキストファイルを持っています。このように:ファイルからさまざまな種類のデータを読み取る方法

アッシャー10 14.5

ジュリア14 15.5

Iは、3つの別々のアレイにこのデータを読み取る必要があります。 Cは文字列配列を持たないので、char配列、int配列、double配列が必要です。私のコード:

const int num = 18; //number of data.txt lines 
char col_one[15]; 
int col_two; 
double col_three; 
int c; 
int numberArray[num]; 
char *nameArray[num]; 
double doubleArray[num]; 
int size = 0; 
FILE *file; 
file = fopen("data.txt", "r"); 
if (file) { 
    while ((c = getc(file)) != EOF) 
    { 
     fscanf(file, "%s %d %lf", &col_one, &col_two, &col_three); 
     nameArray[size] = col_one; 
     numberArray[size] = col_two; 
     doubleArray[size] = col_three; 
     size++; 
    } 
    fclose(file); 
} 


for (int i = 0; i < num; i++) 
{ 
    printf("%s \n" ,nameArray[i]); 
} 

しかし、私のコードは最初の単語だけを読み取り、それを18回印刷します。どのように文字列変数を読み込んでそれをchar配列に入れることができますか?

nameArray[size] = col_one; 

+0

'fscanf' – izlin

+0

'しばらく()(C = getc関数(ファイル)!= EOF) { 関数fscanf(ファイル、 "%sの%D%LF"、&col_one、&col_two、&col_threeの戻り値をチェックしてみてください);ファイル名 "%14s%d%lf"、col_one、&col_two、&col_three)== 3 && size BLUEPIXY

+0

そして' i < num;' --> 'i BLUEPIXY

答えて

2

は、あなたは非常に同じ場所へnameArrayポイントのすべての要素を作ります。これは、すべての文字列が同じである(そして最後に読んだ文字列に等しい)ように見えます。

これにはいくつかの解決策がありますが、データとして構造を使用し、次にその構造に対して1つの配列を使用することをお勧めします。次に、一時変数やポインタの配列を使わずに、構造体自体を直接読み込みます。おそらく、

のようなもの:上記のコードでは

struct data 
{ 
    char name[15]; 
    int int_value; 
    double float_value; 
}; 

struct data data_array[num]; 

... 

while (fscanf(file, "%14s, %d %lf", data_array[size].name, 
            &data_array[size].int_value, 
            &data_array[size].float_value) == 3) 
{ 
    ++size; 
} 

、あなたはまた、ファイルの非常に最初の文字を読んで捨てるという、別の問題を解決します。

関連する問題