getline()的返回值问题
有这样一个题目:打开一个指定的文本,在每一行前加行号(如1.)。
我是这么编的。
- C/C++ code
#include<fstream>using namespace std;int main(){ char *s; fstream myFile("test.txt"); int i=0; s=new char[10]; while(myFile.getline(s,10,'\n')) myFile<<++i<<"."<<s<<endl; delete s; myFile.close();}test.txt里的内容比如说是
aaaa
bbbb
cccc
dddd
执行后,test.txt的内容应该变成
1.aaaa
2.bbbb
3.cccc
4.dddd
但我的程序在执行以后test.txt里的内容居然一点没改变!
大家帮帮忙看看程序哪儿写得有问题啊,谢啦!
[解决办法]
这个fstream流好像不像,istream,和ostream那样,没有自己定义是读还是取
应该自己先定义fstream myFile("test.txt",ios::??/);//?号有in,out,app之类的
我技术有限,不过有个笨方法就是:
fstream myFile("test.txt"),myFile2("test2.txt",ios::out);
while(myFile.getline(s,10,'\n'))
{
cout<<s<<endl;
myFile2<<++i<<"."<<s<<endl;
}//弄完了,可以用dos命令重命名,和删除原来的文件,方法确实笨,我都汗啊!!!
就此观注一下,是否有高手来个简单的方法,呵呵
[解决办法]
#include<fstream>
using namespace std;
int main()
{
// create temp file first
fstream temp("e:\\temp.txt", ios::in | ios::out);
fstream myFile("e:\\test.txt", ios::in | ios::out);
temp << myFile.rdbuf();
myFile.close();
temp.close();
char *s;
temp.open("e:\\temp.txt", ios::in | ios::out);
myFile.open("e:\\test.txt", ios::in | ios::out);
int i=0;
s=new char[10];
while(temp.getline(s,10,'\n'))
myFile<<++i<<"."<<s<<endl;
delete s;
myFile.close();
temp.close();
//delete temp file
}
[解决办法]
- C/C++ code
int main(){ string s; vector<string> sv; sv.reserve(100); ifstream in("E:\\test.txt"); if(!in) return -1; while(getline(in,s)) sv.push_back(s); in.close(); ofstream out("E:\\test.txt"); if(!out) return -1; int i=1; vector<string>::const_iterator beg(sv.begin()),end(sv.end()); for(;beg!=end;++beg) { out<<i++<<": "<<*beg<<'\n'; }//////////////////////////////////////////////////////// system("PAUSE"); return 0;}
[解决办法]
用vector<string>暂存文件
- C/C++ code
#include <iostream>#include <string>#include <fstream>#include <vector>using namespace std;int main(){ fstream f("t.txt",ios::trunc | ios::out | ios::in); f<<"a\nb\nc\nd\ne\n"; vector<string> tf; string t; f.clear(); f.seekp(0,ios::beg); for(getline(f,t); !f.eof(); getline(f,t)) tf.push_back(t); f.clear(); f.seekp(0,ios::beg); for(int i = 1; i <= tf.size(); ++i) f<<i<<'.'<<tf[i - 1]<<endl; f.clear(); f.seekp(0,ios::beg); for(getline(f,t); !f.eof(); getline(f,t)) cout<<t<<'\n'; f.close();}
[解决办法]
#include "stdafx.h"
#include <fstream>
using namespace std;
int main()
{
fstream myFile( "e:\\test.txt", ios::in | ios::out );
char *s;
int i = 0;
s = new char[10];
while( myFile.getline(s,10,'\n') )
{
streamoff nCurrent = myFile.tellg();
int nPrev = nCurrent - strlen( s ) - 2;
myFile.seekg( nPrev );
myFile<< ++i << s;//<< endl;
myFile.seekg( nCurrent );
}
delete s;
myFile.close();
}
以上代码只是表示读和写是可以同时做的,但是要控制好seek的position
我去掉了endl和.这样才能保证串的大小不变。如果你调用myFile<< ++i << "."<< s << endl;
长度大的话,就会把后面的数据“bbbb” 给冲掉。
所以说同时读写是很难的。不如用临时文件或者写到vector里面
[解决办法]
输出到另一个文件中吧.
对同一个文件这样同时读写是不行的.