weixin_36978036 2017-06-11 03:27 采纳率: 66.7%
浏览 1044
已采纳

有关文件指针的一点问题

#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

  • 写回答

2条回答 默认 最新

  • 战在春秋 2017-06-11 06:25
    关注

    可我只移动了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文件进行读操作
    

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记