鸡蛋头lw 2022-03-19 23:03 采纳率: 100%
浏览 133
已结题

c++ tellg和tellp返回值不一样怎么回事?

问题

最近在学fstream时想要获得文件大小,结果发现用seekg和seekp后,tellg和tellp的返回值不一样。

测试代码
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream file;
    // test.txt : abcdefghijklmn
    file.open(".\\test.txt", ios::ate | ios::in | ios::out |ios::binary);

    streampos length = 0;

    // file.seekp(ios::end);
    length = file.tellp();
    cout << "tellp:" << length << endl;
    // file.seekp(ios::beg);

    length = 0;

    file.seekg(ios::end);  // 注释掉这一行后两者结果相同
    length = file.tellg();
    cout << "tellg:" << length << endl;
    // file.seekg(ios::beg);

    return 0;
}
运行结果
未注释21行时:

PS D:\soft\code\c++\Pack> g++ .\test.cpp -o .\Output\test.exe
PS D:\soft\code\c++\Pack> .\Output\test.exe
tellp:14
tellg:2

img

注释21行时:

PS D:\soft\code\c++\Pack> g++ .\test.cpp -o .\Output\test.exe
PS D:\soft\code\c++\Pack> .\Output\test.exe
tellp:14
tellg:14

img

问题分析

在试验许多次之后, 发现只要把 file.seekg(ios::end); 给注释掉就会返回值相同
认为问题出在 ios::end 上,但又找不到问什么

PS:由于我其他项目只能使用 istream ,所以只能使用tellg,有谁能帮我解决这个问题吗?

  • 写回答

1条回答 默认 最新

  • SmallAntJ 2022-03-20 01:15
    关注

    seekg的参数用得不对。seekg有两种形式:

    istream& seekg(streampos position); //相对于文件起始位置的偏移量
    istream& seekg(streamoff offset, ios_base::seekdir dir); //相对于指定位置(ios::beg, ios::cur, ios::end)的偏移量
    

    file.seekg(ios::end)对应的是istream& seekg(streampos position),表示相对于文件起始位置的偏移量,ios::end标志位对应的值是2,所以此时ios::end被理解为相对于文件其实位置的偏移量,所以tellg()的结果为2。注释掉这一句的话偏移量不变还是在文件末尾。或者把file.seekg(ios::end)改成file.seekg(0, ios::end)就可以定位到文件末尾。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月19日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵