2017-02-08 5 views
2

私は名前、次いで入力ファイルからデータを読み取り、

Ben  4 
Mary 12 
Anna 20 
Gary 10 
Jane 2 

と等インデントによって分離された数を有する入力ファイルを読み取る予定の構造体配列にそれを格納する後ヒープの並べ替えを行いますデータに私はデータをコピーして構造体配列に格納するのに問題があります。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define maxcustomers 100 

struct customer{ 
    char name[20]; 
    int service; 
}; 

int main() 
{ 
    struct customer list[maxcustomers]; 
    int i; 
    char c; 

    FILE *input; 
    FILE *output; 
    input = fopen("input-file.txt","r"); 
    output = fopen("output-file.txt","w"); 

    if(input == NULL){ 
     printf("Error reading file\n"); 
     exit(0); 
    } 
    else{ 
     printf("file loaded."); 

    } 
    while((c=fgetc(input))!=EOF){ 
      fscanf(input, "%s %d", &list[i].name,&list[i].service); 

      printf("%s %d", list[i].name,list[i].service); 
      i++; 
    } 
    fclose(input); 
    //heapsort(a,n); 
    //print to output.txt 
    fclose(output); 

    return 0; 
} 

これまで登録するとファイルが開き、「ファイルが読み込まれました」が表示されますが、その後は失敗します。私は明らかに構造体にデータを保存していません。

+1

@chrisaycockは "あなたが'必要があります" %sの\トン%D "''の代わりの" %sの%dの" ' - >番号' '\ t''と'%2'が空白の先頭を消費するので、ここでは空白にマッチします。 – chux

答えて

5

あなただけfscanfを使用し、fgetcfscanfの両方でファイルを歩く/消費している:それはすでにあるので、あなたが&list[i].nameにオペレータのアドレスを必要としないこと

while (fscanf(input, "%19s %d", list[i].name, &list[i].service) == 2) { 
     printf("%s %d", list[i].name, list[i].service); 
     i++; 
} 

お知らせ(に崩壊)Aポインタ。

+0

コンパイル時に警告が出ます:ポインタと整数の比較== 2 – user54648941

+0

@tanner、strange 'fscanf'がポインタではなく' int'を返すので、 –

+0

fscanfsのカッコを閉じていなかったので、今すぐに動作します。 – user54648941

3

@Keine Lustに加えて、 iには初期値がありません。

試してみてください。 int i=0

関連する問題