当我试图获得文件大小时,我有以下块来测试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是否会返回最后一次查找到的字节
- 为什么stream5结果为0?它以前的位置在文件的末尾
- seekg将始终从文件的开头开始,如stream5中所示
- seekg是否不能如stream5中所示向后
- seekg的第一个参数到底是什么意思?它说这是第二个参数的偏移量。如果是正值,则它似乎超出了第二个参数所指的位置,如stream4中所示
- 如果我想知道前100个字节之后的大小,我必须使用-100,如stream8中所示
- 为什么stream10是2
- 流中的seekp和tellp是否具有此处的seekg与tellg属性
好了,开始吧:
- 没有。
tellg()
将生成有助于返回到当前位置的位置对象。返回的类型是std::streampos
,即std::fpos<std::mbstate_t>
。然而,std::fpos<std::mbstate_t>
转换为作为整数的std::streamoff
。从本质上讲,std::streampos
转换为从第一个位置到当前位置的字符数 - 查找相对于
std::ios_base::beg
的0
字符可以清楚地将位置设置为文件的开头。你是想用std::ios_base::cur
吗 - 没有。
seekg()
将相对于开始、当前位置或结束,具体取决于,其中参数为std::ios_base::beg
、std::ios_base::cur
或std::ios_base::end
- 没有。您可以使用负偏移量后退
- 参见3.:第一个参数是相对于where参数指定的位置移动的偏移量
- 没有。如果知道文件中有多少个字符,则从该数字中减去100
- 您使用where值作为位置来进行绝对定位。
std::ios_base::seekdir
类型是枚举,std::ios_base::end
可能具有值2
- 差不多