关于c++中流随机访问和文件读写问题
这是c++primer5中的例子#include<string>#include<iostream>#include<sstream>#include<fstream>u...
这是c++primer 5 中的例子#include<string>#include<iostream>#include<sstream>#include<fstream>using namespace std;int main(int argc, char* argv[]){fstream fs("aa.txt", fstream::ate | fstream::in | fstream::out); if (!fs) { cerr << "Unable to open file!" << endl; return EXIT_FAILURE; } auto end_mark = fs.tellg(); cout << "end_mark= " << end_mark << endl; fs.seekg(0, fstream::beg); int cnt = 0; string line; while (fs&&fs.tellg() != end_mark&&getline(fs, line)) { cnt += line.size() + 1; auto mark = fs.tellg(); cout << "mark= " << mark << endl; fs.seekp(0, fstream::end); fs << cnt; if (mark != end_mark) fs << " "; fs.seekg(mark); } fs.seekp(0, fstream::end); fs << "****\n"; fs.close(); system("pause"); return 0;}当文件内容为图1时,为什么运行内容为图2,并没有在文件结束后加****,再次执行后为什么为图3,并没有重新进行统计
展开
1个回答
展开全部
#include<string>
#include<iostream>
#include<sstream>
#include<fstream>
using namespace std;
int main(int argc, char* argv[])
{
fstream fs("aa.txt", fstream::ate | fstream::in | fstream::out);//打开文件供读写,移到结尾
if (!fs) //打开文件出错
{
cerr << "Unable to open file!" << endl;
return EXIT_FAILURE;
}
auto end_mark = fs.tellg(); //定义文件结束标记,等于文件长度
cout << "end_mark= " << end_mark << endl;
fs.seekg(0, fstream::beg); //操作指针移到文件开始
int cnt = 0;
string line;
while (fs&&fs.tellg()!= end_mark&&getline(fs, line))
{
//cout<<"line="<<line<<endl;
cnt += line.size() + 1;
auto mark = fs.tellg();
cout << "mark= " << mark << endl; //保存并输出当前指针位置
fs.seekp(0, fstream::end); //操作指针移到文件结尾
fs << cnt; //写入计数
if (mark != end_mark) fs << " "; //文件未完,继续读
fs.seekg(mark); //操作指针移回上面保存的读取位置
}
cout<<"tellg()="<<fs.tellg()<<endl;//这时看看,位置到结尾了.
//fs.seekp(0, fstream::beg);
cout<<"注意这个输出:"<<line<<endl; //上面循环中getline(fs,line)已经读到最后一行了,
//注意看了,这是为什么原程序不会往文件结尾写入 "****" 的原因:
//在上面while循环操作中,操作指针已移到文件结尾,再调用seekg有可能出现无效!!
//必须先clear()或者再随便移一下指针位置,按http://www.cplusplus.com/reference/istream/istream/seekg/
//里面提到:
//C++99 :If the eofbit flag is set before the call, the function fails (sets failbit and returns).
//C++11 :The function clears the eofbit flag, if set before the call.
///网上大神也说: end of file的时候, seek是无效的, 必须先clear.
//所以,会出现问题中的 星号 写不进文件的情形.保险起见,下面改成:
fs.clear(); //或者用下面这句,两句选一
//fs.seekg(0, fstream::beg); //动一动指针,移到文件开始
//不然,进不了下面判断中if部分. 总之,这一部分挺乱的,C++98,C++11标准支持不同.
if(fs) //先判断文件还有没有打开
{
fs.seekp(0, fstream::end); //移到结尾 .
fs <<cnt; //写入最后一行计数
fs << "****\n"; //原程序根本来不到这里.所以无法操作.现在可以操作了,写入.
cout<<"success!"<<endl;
}
else
{
cout<<"end of file"<<endl;
}
fs.close();
//system("pause");
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询