【发布时间】: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
我的问题如下:
- tellg 会返回最后一个 seekg 找到的字节吗?
- 为什么 stream5 结果为 0?它之前的位置在文件的末尾。
- seekg 将始终从文件的开头开始,如 stream5 所示?
- seekg 不能如 stream5 所示后退?
- seekg 的第一个参数是什么意思?它说它是第二个参数的偏移量。如果它是一个正值,它似乎超出了第二个参数所指向的位置,如 stream4 所示。
- 如果我想知道前 100 个字节之后的大小,我必须使用 stream8 中所示的 -100?
- 为什么 stream10 是 2?
- seekp 和 tellp 在 ofstream 中有 seekg 和 tellg 属性吗?
【问题讨论】:
-
tellg 返回文件的当前位置。 阅读手册页。顺便说一下,你只有一个流。
-
你调用 in.seekg(0,ios::beg);在流 5 之前。为什么它应该是 0 以外的任何值?
-
同样对于 6,为什么不简单地获得全尺寸并减去 100?如果文件小于 100 字节,您可以将位置设置为低于流的开头。我对此进行了测试,对于较小的文件,返回大小为 -1,我认为这是故障位错误集。