【问题标题】:get file size with ifstream::seekg and tellg使用 ifstream::seekg 和 tellg 获取文件大小
【发布时间】:2013-12-28 16:42:20
【问题描述】:

当我尝试获取文件大小时,我有以下块来测试 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 会返回最后一个 seekg 找到的字节吗?
  2. 为什么 stream5 结果为 0?它之前的位置在文件的末尾。
  3. seekg 将始终从文件的开头开始,如 stream5 所示?
  4. seekg 不能如 stream5 所示后退?
  5. seekg 的第一个参数是什么意思?它说它是第二个参数的偏移量。如果它是一个正值,它似乎超出了第二个参数所指向的位置,如 stream4 所示。
  6. 如果我想知道前 100 个字节之后的大小,我必须使用 stream8 中所示的 -100?
  7. 为什么 stream10 是 2?
  8. seekptellp 在 ofstream 中有 seekgtellg 属性吗?

【问题讨论】:

  • tellg 返回文件的当前位置。 阅读手册页。顺便说一下,你只有一个流。
  • 你调用 in.seekg(0,ios::beg);在流 5 之前。为什么它应该是 0 以外的任何值?
  • 同样对于 6,为什么不简单地获得全尺寸并减去 100?如果文件小于 100 字节,您可以将位置设置为低于流的开头。我对此进行了测试,对于较小的文件,返回大小为 -1,我认为这是故障位错误集。

标签: c++ c


【解决方案1】:

好的,我们开始:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2023-02-04
    • 1970-01-01
    • 2013-05-11
    • 2019-05-05
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多