Вопрос с FREAD и FWRITE в C - PullRequest
       24

Вопрос с FREAD и FWRITE в C

2 голосов
/ 15 марта 2011

ниже приведен мой код для записи некоторых жестко запрограммированных значений 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

Ответы [ 2 ]

1 голос
/ 15 марта 2011

В следующем фрагменте кода вы всегда используете 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++;
   }

И тогда вы можете изменить цикл чтения соответственно

1 голос
/ 15 марта 2011

Проблема в этой строке:

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

Все 5 вызовов fwrite имеют одинаковый адрес буфера, поэтому каждый раз, когда вы пишете первый элемент массива, который равен 1.

Поскольку вы хотите записать все элементы массива один за другим, передайте buf+i как начальный адрес fwrite:

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

Теперь начальный адрес буфера,1013 * gets - это адрес i-го элемента массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...