今天在使用std::fstream操作文件时,与到一个问题seek(std::ios::end)与seekg(0, std::ios::end)的差异。虽然查阅各种资料,然而还是无解,希望有深入理解C++标准高手指点一二。
闲话少说,先看如下代码
void CExceptionManager::ExceptionRecord(const std::string& text)
{
//构造异常记录文件名, 文件路径
CTime t = CTime::GetCurrentTime();
std::string filename, filepath;
std::stringstream ss;
ss << t.GetYear() << t.GetMonth() << t.GetDay() << ".txt";
ss >> filename;
filepath = ".\\Log\\CCTS\\Exception\\" + filename;
//创建文件流
//std::fstream 继承了 std::ifstream & std::ofstream, 二者的操作都是以内存为基准, 操作都是相对于内存来说的
//std::ifstream : 将文本文件数据输入内存
//std::ofstream : 将内存的数据输出至文本文件
std::fstream fs(filepath.c_str(), std::ios::app | std::ios::in);
if (fs.fail())
{
throw std::exception("呃...什么鬼? 文本操作竟然都出现异常?");
}
//判断文件内容是否为空?: 先将标记定位至输入流的 std::ios::end 位置, 然后读取标记读取的位置; 如果标记为0, 则内容为空
//注意: 一定要将 offset 设置为 0, 否则会有问题, 虽然 MSDN 并不支持这样做
fs.seekg(0, std::ios::end);
//然后获取标记读取位置
std::streamoff pos = fs.tellg();
if (0 == pos)
{//如果位置等于0, 则可以说明文件内的数据为空, 这时要写入一串"*"
std::string s(128, '*');
fs << s << "\r\n";
}
fs << text;
fs.close();
}
以上代码看似没有问题,然而如果将 "fs.seekg(0, std::ios::end);" 改为 "fs.seekg(std::ios::end);"; 那么将会出现如下问题:
1. "tellg()" 返回值永远是 2 ?
2. MSDN里面有段原话: Do not use the second member function with text files, because Standard C++ does not support relative seeks in text files. 也就是说,在文本文件里C++不支持使用相对搜索,然而,这里却使用的好好的,相反使用fs.seekg(std::ios::end);出现了问题。这又是为何?
求好心的大神解释。