我有以下代码块来测试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个字节后的大小,我必须使用 -100,就像 stream8 中所示吗?
- 为什么 stream10 是2?
- ofstream 中的 seekp 和 tellp 是否与这里的 seekg 和 tellg 具有相同的属性?