使用ifstream::seekg和tellg获取文件大小



当我试图获得文件大小时,我有以下块来测试seekg和tellg的行为:

    int size = 0;
    ifstream in(fileName.c_str(), ifstream::in | ifstream::binary);
    if(in)
    {
        in.seekg(0,ifstream::end);
        size = in.tellg();
        cout << endl;
        cout << endl;
        cout << "********** size stream1*** =" << size << endl;
        in.seekg(0,ios::end);
        size = in.tellg();
        cout << "********** size stream2*** =" << size << endl;
        in.seekg(0,ios::end);
        size = in.tellg();
        cout << "********** size stream3*** =" << size << endl;
        in.seekg(100,ios::end);
        size = in.tellg();
        cout << "********** size stream4*** =" << size << endl;
        in.seekg(0,ios::beg);
        size = in.tellg();
        cout << "********** size stream5*** =" << size << endl;
        in.seekg(100);
        in.seekg(0, ios::end);
        size = in.tellg();
        cout << "********** size stream6*** =" << size << endl;
        in.seekg(100);
        in.seekg(0, ios::cur);
        size = in.tellg();
        cout << "********** size stream7*** =" << size << endl;
        in.seekg(-100,ios::end);
        size = in.tellg();
        cout << "********** size stream8*** =" << size << endl;
        in.seekg(ios::beg,ios::end);
        size = in.tellg();
        cout << "********** size stream9*** =" << size << endl;
        in.seekg(ios::beg);
        in.seekg(ios::end);
        size = in.tellg();
        cout << "********** size stream10*** =" << size << endl;
        cout << endl;
        cout << endl;
    }

其结果如下:

********** size stream1*** =1846
********** size stream2*** =1846
********** size stream3*** =1846
********** size stream4*** =1946
********** size stream5*** =0
********** size stream6*** =1846
********** size stream7*** =100
********** size stream8*** =1746
********** size stream9*** =1846
********** size stream10*** =2

我的问题如下:

  1. tellg是否会返回最后一次查找到的字节
  2. 为什么stream5结果为0?它以前的位置在文件的末尾
  3. seekg将始终从文件的开头开始,如stream5中所示
  4. seekg是否不能如stream5中所示向后
  5. seekg的第一个参数到底是什么意思?它说这是第二个参数的偏移量。如果是正值,则它似乎超出了第二个参数所指的位置,如stream4中所示
  6. 如果我想知道前100个字节之后的大小,我必须使用-100,如stream8中所示
  7. 为什么stream10是2
  8. 流中的seekptellp是否具有此处的seekgtellg属性

好了,开始吧:

  1. 没有。tellg()将生成有助于返回到当前位置的位置对象。返回的类型是std::streampos,即std::fpos<std::mbstate_t>。然而,std::fpos<std::mbstate_t>转换为作为整数的std::streamoff。从本质上讲,std::streampos转换为从第一个位置到当前位置的字符数
  2. 查找相对于std::ios_base::beg0字符可以清楚地将位置设置为文件的开头。你是想用std::ios_base::cur
  3. 没有。seekg()将相对于开始、当前位置或结束,具体取决于,其中参数为std::ios_base::begstd::ios_base::curstd::ios_base::end
  4. 没有。您可以使用负偏移量后退
  5. 参见3.:第一个参数是相对于where参数指定的位置移动的偏移量
  6. 没有。如果知道文件中有多少个字符,则从该数字中减去100
  7. 您使用where值作为位置来进行绝对定位。std::ios_base::seekdir类型是枚举,std::ios_base::end可能具有值2
  8. 差不多

最新更新