关于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,并没有重新进行统计 展开
 我来答
fallx
2018-02-08 · TA获得超过5486个赞
知道大有可为答主
回答量:2321
采纳率:73%
帮助的人:726万
展开全部
#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;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式