与FILE一起工作,理解给定的代码

  • 本文关键字:代码 FILE 一起 工作
  • 更新时间 :
  • 英文 :


给定infile-1 -2 4 -7 11 -6 -13

为什么输出为:1 18 ?

#define AD(x,y) abs(x-y)的线是多少?为什么需要AD ?

#define AD(x,y) abs(x-y)
int main()
{
   FILE *fin, *fout;
   int arr[2], num;
   fin=fopen("infile","rb");
   fout=fopen("outfile","wb");
   while (fread(arr,sizeof(int),2,fin)==2)
   {
      num=AD(arr[0],arr[1]);
      fwrite(&num,sizeof(int), 1,fout);
      fseek(fin, sizeof(int), SEEK_CUR);
    }
  fclose(fin);
  fclose(fout);
}

我希望我的回答能澄清大部分问题。下面是对代码的一些修改,解释了一些问题:

#include <stdio.h>
#include <stdlib.h>
#define AD(x,y) abs((x)-(y))
int val[] = {-1,  -2,  4,  -7,  11,   -6,  -13};
int cnt = sizeof(val)/sizeof(int);
// create the binary file with the specified numbers
void createInputFile()
{
    printf("Elems count = %d, sizeof(int) = %dn", cnt, sizeof(int));
    FILE *f = fopen("infile", "wb");
    int i;
    for(i=0; i<cnt; i++)
    {
        fwrite(&val[i], sizeof(int), 1, f);
        printf("%d ", val[i]);
    }
    printf("n");
    fclose(f);
}
int main()
{
   FILE *fin, *fout;
   int arr[2], num;
   createInputFile();
   // example how to read back the numbers from the binary file (each time 2 numbers are read, if the list contains an odd
   // number of values, last one is not printed on screen because the while condition fails)
   /*fin=fopen("infile","rb");
   while (fread(arr,sizeof(int),2,fin)==2)
   {
      printf("-> %d %dn", arr[0], arr[1]);
   }
   fclose(fin);
   */
   fin=fopen("infile","rb");
   fout=fopen("outfile","wb");
   while (fread(arr,sizeof(int),2,fin)==2)
   {
      printf("read %d %dn", arr[0], arr[1]);
      num=AD(arr[0],arr[1]);
      fwrite(&num,sizeof(int), 1,fout);
      printf("computed %d which represents absolute value of (%d - %d)n", num, arr[0], arr[1]);
      fseek(fin, sizeof(int), SEEK_CUR); // advance in the input file with sizeof(int) bytes, i.e. skip one int value
    }
  fclose(fin);
  fclose(fout);
  return 0;
}
以下

#define AD(x,y) abs((x)-(y)) 

不是一个函数,而是一个宏定义。每次在C代码中找到AD时,它在编译前被abs取代。AD有两个参数,x和y。因此AD(arr[0], arr[1])将被abs((arr[0])-(arr[1]))取代,它计算数字之差的绝对值。注意,每次使用宏定义参数时,它都被括在括号中。检查以下内容:

AD(-2, -3) 
如果不使用括号,

将被abs(-2—3)代替。

这就是为什么强烈建议在每次使用宏参数时用圆括号括起来的原因。

当从文件中读取时,无论是文本文件还是二进制文件(如您的示例),文件指针都会随着读取的值/字节数在文件中前进。如果您想读取所有数据(请参阅注释的while循环),则不需要使用额外的fseek()调用。在您的示例中调用

fseek(fin, sizeof(int), SEEK_CUR);

使文件指针向前移动一个整型位置,因为

已经向前移动了2个整型位置。

从文件中读(arr sizeof (int), 2,鳍)

所以结果是正确的,但是您应该说明您期望代码做什么。

上面代码的输出是:
Elems count = 7, sizeof(int) = 4
-1 -2 4 -7 11 -6 -13
read -1 -2
computed 1 which represents absolute value of (-1 - -2)
read -7 11
computed 18 which represents absolute value of (-7 - 11)

相关内容

最新更新