3

私が抱えている問題は、テキストファイルを作成し、一度テキストに書き込むことができるということです。新しいファイルを作成せずに、必要に応じて行を追加できるようにしたい。私の次の問題は、私が探している出力を取得できないように見えることです。例えば。テキストファイルに含まれる

start1
fname | lname | ssn
end1

私の目的は、start1とend1内のデータのみを取得し、区切り文字|なしでfnamelnameとssnを返すことです。これが私のコードです

int main()
{
    fstream filestr;
    string line;

    filestr.open ("file.txt", fstream::in | fstream::out | fstream::app);
    if(!filestr.is_open())
    {
        cout << "Input file connection failed.\n";
        exit(1); 
    }
    else{
        filestr<<"Start2\n";
        filestr<< "middle|middle"<<endl;
        filestr<<"end2"<<endl;
        if(filestr.good()){
            while(getline(filestr, line) && line !="end1"){
                if(line !="Start1"){
                    //below this point the output goes screwy
                    while(getline(filestr, line,'|')){
                        cout<<"\n"<<line;
                    }
                }
            }
        }
        filestr.close();
    }
4

2 に答える 2

2

ほぼ:

読み取り位置を追加するためにファイルを開くと、最後になります。したがって、読み始める前に、最初に戻る(または閉じて再度開く)必要があります。

        filestr.seekg(0);

2番目の問題は、whileループが終了をチェックしないときにネストしたことです。

                while(getline(filestr, line,'|')){
                    cout<<"\n"<<line;

これはラインを分割します。しかし、それは行の終わりで止まりません。ファイルの最後に到達するまで続行します。

あなたがすべきことは、現在の行を取得し、それを独自のストリームとして扱うことです。

            if(line !="Start1")
            {   
                std::stringstream   linestream(line);
              // ^^^^^^^^^^^^^^^^^^  Add this line

                while(getline(linestream, line,'|'))
                {         //  ^^^^^^^^^^ use it as the stream
                    cout<<"\n"<<line;
                }   
            }

PS:file.txt内

start1
^^^^^ Note not Start1
于 2012-05-09T23:52:30.233 に答える
1
while(getline(filestr, line))
{
      if(line !="Start1" && line != "end1")
      {
          // Get the tokens from the string.           
      }
}
于 2012-05-09T23:54:33.170 に答える