给定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)