Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言提问fread和fwrite_C_File_File Io_Fwrite_Fread - Fatal编程技术网

用C语言提问fread和fwrite

用C语言提问fread和fwrite,c,file,file-io,fwrite,fread,C,File,File Io,Fwrite,Fread,下面是我将一些硬编码的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值(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;


}

问题出在这一行:

ret = fwrite(buf,sizeof(int),1,fptr);
fwrite
的所有5个调用都具有相同的缓冲区地址,因此每次写入数组的第一个元素时,即
1

由于要逐个写入所有数组元素,请将
buf+i
作为起始地址传递给
fwrite

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

现在,
fwrite
获取的缓冲区的起始地址是数组的
i
th元素的地址。

在下面的代码段中,您总是使用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);
     }
    }

然后你可以相应地修改你的读取循环,缩进使它很难读取。对不起,我赶时间。我下次发帖时会记住这一点。非常感谢。每次它试图写入整个数组,是吗?@Namratha:不是。每次它都在写入数组的第一个元素。明白了。非常感谢你。它正在工作。如果我想直接从程序外部查看文件内容,我该怎么做?可能吗?@Namratha:尝试使用文件的八进制转储:
od-bc filename
  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);
     }
    }
//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++;
   }