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

有关文件指针的一点问题

#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文件进行读操作
    

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

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

    已采纳该答案
    打赏 评论
  • 好大一个土豆 2017-06-11 03:40

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

    打赏 评论

相关推荐 更多相似问题