2017-02-12 3 views
-2

ファイルから数値を読み込み、配列に入れたいと思います。 問題は、数字が正しく抽出されましたが、は配列に保存できませんでした。これは、プログラムの実行後に配列が空であることを意味します。私はこのコードはスレッドによって使用されることを言及する必要があります。ここ はコードです:あなたのループ内Cのファイルから抽出番号で配列を塗ります

int ordercount=0; 
//initialize 
int Order[10]={0}; 
int Credit[10]={50,50,50,50,50,50,50,50,50,50}; 
//For reading a file 
FILE *myfile; 
//Semaphore 
pthread_mutex_t mtx; 
char char_get; 



void *orders(void *arg) 
{ 
///////////////////////////////////////////read from a file 
    myfile=fopen("List.txt","r+"); 
    int k=0; 
     //pthread_mutex_lock(&mtx); 
     fscanf (myfile, "%d", &k); 
     while (!feof (myfile)) 
     { 
      ordercount++; 
      Order[k]=k; 
      printf("The initial Order is: %d \n",Order[k]); 
      fscanf (myfile, "%d", &k); 
     } 
     fclose (myfile); 
     //pthread_mutex_unlock(&mtx); 

} 
+3

'受注[K] = K(do/while、ファイル内の値が多すぎに対する保護を使用して);'これは何をするになっていますか? – stark

+2

あなたは 'ordercount'を使用せず、あなたの配列内のランダムな場所にアイテムを格納するだけです。 –

+0

@stark:応答してくれてありがとう、私は何かを計算するために別のスレッドで使っています。 – Reza

答えて

2

あなたはkに格納された整数値を読んでいる:

あなたはあなたのリストに

ordercount++; 
    Order[k]=k; 
kを割り当てている同じループで
fscanf (myfile, "%d", &k); 

ordercount(配列アクセスBTWより前にインクリメントされているため1より大きすぎます)の代わりにを使用していますをインデックスとして使用してください。

値が10より大きい場合は、Order予約済みメモリ外のデータを格納しています:未定義の動作。

(あなたprintf("The initial Order is: %d \n",Order[k]);文はそれが正しい割り当てた後だし、それはあなたがkを保存するためには表示されませんので、動作するように思われることに注意してください:あなたはそれがないのに対し、それは、連続したストレージであるという幻想を持っている)

私はこのようなことを書き換えます:

// don't perform the initial fscanf, do/while avoids that 
    do 
    { 
     if (fscanf (myfile, "%d", &k)!=1) 
     { 
      printf("parsing error\n"); // maybe should exit if error? 
     } 
     printf("The initial Order is: %d @ %d \n",k,ordercount); 
     Order[ordercount++]=k; // filling with values with increasing index, not random 
    } 
    while (!feof (myfile) || ordercount==sizeof(Order)/sizeof(Order[0])); 

+0

いいですが、問題は配列ができることです満たされない。ソリューションがこの問題にどのように役立つか? – Reza

+0

配列は塗りつぶされていますが、まばらで、連続していません。私の編集内容を確認してください。 –

関連する問題