2017-04-12 19 views
0

こんにちは私はファイルから整数の配列を読み書きしようとしていますが、それらを読み込むために使用しているループは無限ループです。どのようにしてこの無限ループを修正して、ファイルの終わりに達したときにループを終了するようにします。また、フリーダが私が期待していることをしているかどうかは完全にはわかりません。バイナリファイルから整数の配列を読み書きする

FILE *fptr = fopen("number.db", "wb"); 
int nums[100] = {1,2,3,4,5,6,7,8,9,100,101,102,103,104,105}; 
int nums2[100]; 

fwrite(nums,sizeof(int),15,fptr); 
fclose(fptr); 

fptr = fopen("number.db", "rb"); 
    fseek(fptr,0,SEEK_END); 
    long end = ftell(fptr); //finds length of the file 
    fseek(fptr,0,SEEK_SET); 

while(!feof(fptr)){ 
    int counter = 0; 
    fread(nums2,sizeof(int),1,fptr); 
    fseek(fptr,counter,SEEK_SET); 
    counter++; 
    if(counter>=end){ //Breaks when it seeks to the end 
     break; 
    } 
fclose(fptr); 

私はフリーダの論理に何かがあるように感じますが、私はあまりよく分かりません。 "nums2"に保存されている番号を印刷すると、最後に読み取られた番号だけがnums2のすべての要素に対して105となります。

+2

これは、ループ内で毎回 'counter'を0に初期化し、ポインタをファイルの先頭に移動する' fseek'のため、無限ループです。 – kuro

+0

と 'fread(nums2、sizeof(int)、1、fptr);' - > 'fread(nums2 + counter、sizeof(int)、1、fptr)のループの外側で' int counter = 0; 'を取り出してください。 '、' end/= sizeof(int);が必要です。 – BLUEPIXY

答えて

0

問題は、シーク/カウンタの初期化の組み合わせにあります。

カウンタが0(最初のレコード)になるたびに設定し、それを求めると、ファイルレコードの「有効な範囲」になります。ファイル状態の終了は決して起こらないので、whileルックは無限ループに入ります

if条件(if(counter> = end)も役に立たないと私はそれを削除します。 whileループは、一旦eofを完了すると、これはそうするべきです。

FILE *fptr = fopen("number.db", "wb"); 
int nums[100] = {1,2,3,4,5,6,7,8,9,100,101,102,103,104,105}; 
int nums2[100]; 

fwrite(nums,sizeof(int),15,fptr); 
fclose(fptr); 

fptr = fopen("number.db", "rb"); 
fseek(fptr,0,SEEK_END); 
long end = ftell(fptr); //finds length of the file 
fseek(fptr,0,SEEK_SET); 
int counter = 0; 
while(!feof(fptr)){ 
     fread(nums2,sizeof(int),1,fptr); 
     fseek(fptr,counter,SEEK_SET); 
     counter++; 
     if(counter>=end){ //Breaks when it seeks to the end 
      break; 
     } 
} 
fclose(fptr); 
関連する問題