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

时间:2013-12-10 22:33:08

标签: c++ c

当我尝试获取文件大小时,我有以下块来测试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个字节后的大小,我必须使用-100,如 stream8 所示?
  7. 为什么 stream10 是2?
  8. ofstream中的
  9. seekp tellp 在此处具有 seekg tellg 属性?

1 个答案:

答案 0 :(得分:4)

好的,我们走了:

  1. 否。 tellg()会产生位置对象,可以回到你所处的位置。返回的类型为std::streampos,即std::fpos<std::mbstate_t>。但是,std::fpos<std::mbstate_t>会转换为std::streamoff,这是一个整数。基本上,std::streampos会转换为从第一个位置到当前位置的字符数。
  2. 寻找相对于0的{​​{1}}字符,清楚地将位置设置为文件的开头。您的意思是使用std::ios_base::beg吗?
  3. 否。 std::ios_base::cur将相对于起点,当前位置或结尾,具体取决于 whence 参数为seekg()std::ios_base::begstd::ios_base::cur
  4. 否。您可以使用负偏移量向后返回。
  5. 参见3:第一个参数是相对于 whence 参数指定的位置移动的偏移量。
  6. 否。如果您知道文件中有多少个字符,则从该数字中减去100。
  7. 您使用 whence 值作为位置使用绝对定位。 std::ios_base::end类型是枚举,std::ios_base::seekdir可能具有值std::ios_base::end
  8. 非常。