2

以下は、ハードコードされたint値(1,2,3,4,5)をファイルに書き込み、そのファイルを閉じ、同じファイルを読み取りモードで開き、書き込まれた要素を読み取るための私のコードです。出力からわかるように、fwriteは正しく実行されますが、freadは正しく読み取られません。

#include<stdio.h>
int main()
{

    FILE *fptr;
    FILE *optr;
    const char *filepath = "E:\\testinput.txt";

              int buf[5]={1,2,3,4,5};
    int obuf[5];
         int value;
    int *ptr = &value;

     int num_bytes_read;

    int no_of_iterations;


    int i;

    int ret;//return value for fwrite

    int count = 0;

    no_of_iterations = 5;

    //open the file

    fptr = fopen(filepath, "wb");
    if(fptr == NULL){
       printf("error in opening input file");
    }

    /*optr = fopen(outFilepath, "wb");
    if(optr == NULL){
           printf("error in opening output file");
    }*/



    printf("int %d ", sizeof(int));

    for(i=0;i<5;i++){
        printf("writing %d",buf[i]);
    ret = fwrite(buf,sizeof(int),1,fptr);
     if(ret != 1)
     {
         printf("error in fwrite:%d\n", ret);
     }
    }
    //written to input file
    fclose(fptr);
    fptr = fopen(filepath, "rb");
            if(fptr == NULL){
               printf("error in opening input file");
            }

    for(i=0;i<5;i++){

            //reading from input file
           num_bytes_read = fread(ptr,sizeof(int),1,fptr);
           if(num_bytes_read == 1){


           obuf[i] = *ptr;//storing into buf what is read from file
           printf("read successful: %d\n", obuf[i]);
           count++;
           }
           else{
               count = 99;
            break;
           }


         printf("\ncount%d", count);

  }


  fclose(fptr);

  return 0;


}

手動で(任意のテキストエディタで)開いた場合に書き込まれた入力ファイル5文字以外の英数字(同じ記号が繰り返されます)が表示されます。これがEclipseでの出力です。

int 4 writing 1writing 2writing 3writing 4writing 5read successful: 1

count1read successful: 1

count2read successful: 1

count3read successful: 1

count4read successful: 1

count5
4

2 に答える 2

1

問題は次の行にあります。

ret = fwrite(buf,sizeof(int),1,fptr);

5つの呼び出しすべてがfwrite同じバッファアドレスを持つため、配列の最初の要素である。を書き込むたびに1

すべての配列要素を1つずつ書き込みたいのでbuf+i、開始アドレスとしてfwrite:に渡します。

ret = fwrite(buf+i,sizeof(int),1,fptr);

fwriteこれで、取得するバッファの開始アドレスはi、配列のth要素のアドレスになります。

于 2011-03-15T07:26:45.197 に答える
1

次のコードでは、常に buf を使用するため、常に buf[0] と記述します。

  for(i=0;i<5;i++){
        printf("writing %d",buf[i]);
    ret = fwrite(buf,sizeof(int),1,fptr);
     if(ret != 1)
     {
         printf("error in fwrite:%d\n", ret);
     }
    }

代わりに使用できます&buf[i]。または、ポインターで遊びたいので、 poiner 変数を使用することもできます。

//write loop
   ptr = buf;
   for(i=0;i<5;i++){
        printf("writing %d",ptr[0]);
        ret = fwrite(ptr,sizeof(int),1,fptr);
        if(ret != 1)
        {
            printf("error in fwrite:%d\n", ret);
        }
        ptr++;
   }

そして、それに応じて読み取りループを変更できます

于 2011-03-15T07:32:00.907 に答える