操作文本文件简介

        今天在使用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);出现了问题。这又是为何?

求好心的大神解释。


发布了26 篇原创文章 · 获赞 19 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章