读书人

getline()的返回值有关问题

发布时间: 2012-05-11 12:55:37 作者: rapoo

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里面
[解决办法]
输出到另一个文件中吧.
对同一个文件这样同时读写是不行的.

读书人网 >C++

热点推荐