有关文件指针的一点问题

#include
using namespace std;
int main()
{
int n;
FILE *fp1 = fopen("2.dat", "rb+");
FILE *fp2 = fopen("2.dat", "rb+");
while(1) //文件中只有1 2 3 4这四个整数
{
fread(&n, sizeof(int), 1, fp1);
if(feof(fp1))
break;
cout << n << endl;
}
fseek(fp1, 0, 0);
fp2 = fp1; //令fp2 = fp1
fseek(fp1, sizeof(int)*2, 1);
fread(&n, sizeof(int), 1, fp2);
cout << n << endl; //我瞬间懵了 我移动了fp1 fp2为什么也跟着动了
fclose(fp1);
fclose(fp2);
}

附上输出
1
2
3
4
3

可我只移动了fp1 fp2没动啊

理解上有些偏差,实际上fp1和fp2都没有移动,执行fseek函数后,变化的是与fp有关的 文件位置指针
您可以断点调试,查看fp1,fp2的值,都没有变化。

看一下fseek函数的功能:

 fseek(文件类型指针fp,位移量,起始点);  // 把与fp有关的文件位置指针放到一个指定位置。

进一步:

FILE *fp1 = fopen("2.dat", "rb+");  
FILE *fp2 = fopen("2.dat", "rb+");

由以上代码可知:fp1和fp2都关联同一个文件 2.dat。
所以fp1和fp2对应的是同一个文件位置指针。

因此:

fseek(fp1, sizeof(int)*2, 1);     //2.dat文件位置指针发生变化
fread(&n, sizeof(int), 1, fp2);  //在新的文件位置指针对2.dat文件进行读操作

综上就产生题目描述的现象。

用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢!

前面有fp2=fp1; 所以它们已经指向同一个地址了