4

テキストファイルをチャンクごとに分割し、行のグループを単一の文字列として保存する方法を考えていました..例:

質問のテキスト ファイルがありますが、その中には複数行あるものもあります。可変数の行 (質問が占める行数に応じて) の後に、空白行があり、次に回答があり、その後に別の質問 (1 行より長くなる場合もあります)、空白行、回答が続きます。

このようなもので、「q」は単一の文字列として保存する必要がある行であり、「a」も単一の文字列である必要があります。

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

aaaaaaaaaaaaaaaaaaaaaaa

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

string line + lineifを組み合わせて、1行ずつ読んでみline != ""ました。しかし、それは混乱して面倒になり、正しく動作させることができませんでした.

qの最初のセットを1 つの文字列として保存し、それを に入れvector[0]、最初のaのセットを に入れたいだけですvector[1]qの の 2 番目のセットvector[2]。の 2 番目のセットはa..vector[3]などです。q と a はどちらも複数の行にすることができます。


どんな提案や助けも大歓迎です!

#include <vector>
#include <fstream>
#include <iostream>
#include "Question.h"
#include <iomanip>

using namespace std;

int main(int argc, char * argv[]){
    ifstream infile;
    string filename = "questions.txt";//manually set for testing.

    //cout<<"Enter the questions file: ";
    //cin>>filename;

    infile.open(filename.c_str());

    if (!infile){
            cout<<"error"<<endl;
            return 0;
    }
    else {
            cout<<"file opened!"<<endl;
    }
    vector<string> myvector;

    string line;
    string additionalLine;
    int totalLines = 0;
    while(getline(infile,line)){
            totalLines++;
    }
    cout<<"total lines: "<<totalLines<<endl;

/*
    while(getline(infile,line,'\n')){
            cout<<line<<endl;
    }
*/

    while(getline(infile,line,\n)){
            if (line == ""){
                    cout<<"empty"<<endl;
            }

            else {
                    cout<<"line is not empty"<<endl;
                    additionalLine = additionalLine + line;
            }
            if (line != ""){
                    myvector.push_back(additionalLine);
            }

    }

    for(int i=0; i < (myvector.size()); i++){
            cout<<myvector[i]<<endl;
    }

    //TESTING
    cout<<"Question: "<<endl;
    cout<<myvector[0]<<endl;
    cout<<"Answer: "<<endl;
    cout<<myvector[1]<<endl;

    return 0;

}

4

3 に答える 3

3

私はコードを少し調整して、それを機能させました!

テキスト ファイルの行を循環する方法を変更し、それを while (!infile.eof()) に変更して、手動で行を取得しました。改行があるかどうかを検出するステートメントも追加しました。また、文字列変数を "" にリセットした場所に再配置する必要がありました。

提案をありがとう!ソリューションコードは次のとおりです。

#include <vector>
#include <fstream>
#include <iostream>
#include "Question.h"
#include <iomanip>

using namespace std;

int main(int argc, char * argv[]){
    ifstream infile;
    string filename = "questions.txt";//manually set for testing.

    //cout<<"Enter the questions file: ";
    //cin>>filename;

    infile.open(filename.c_str());

    if (!infile){
            cout<<"error"<<endl;
            return 0;
    }
    else {
            cout<<"file opened!"<<endl;
    }
    vector<string> myVec;

    string line;
    string comboLine="";

    while(!infile.eof()){
            getline(infile,line);

            if (line == "" || line == "\0")  {
                    //cout<<"->BLANK LINE DETECTED<-"<<endl;
                    myVec.push_back(comboLine);
                    comboLine="";
            }else {
                    comboLine = comboLine + line;
                    //cout<<"comb: "<<comboLine<<endl;
            }

            line = "";

    }
    infile.close();

    //TESTING
    cout<<"Question: "<<endl;
    cout<<myVec[0]<<endl;
    cout<<"Answer: "<<endl;
    cout<<myVec[1]<<endl;
    cout<<"Question 2: "<<endl<<myVec[2]<<endl;
    cout<<"Answer 2: "<<endl<<myVec[3]<<endl;
    return 0;

}
于 2013-02-07T00:36:19.083 に答える
1

Qtを使用している場合は、これを簡単に行うことができます。

QFile myFile;
myFile.open(QIODevice::ReadOnly | QIODevice::Text);

QTextStream openFile(&myFile);

while (!myFile.atEnd()) {

    QString line;
    QStringList tokens;
    line = myFile.readLine();
    tokens = line.split("\n");

    // additional processing here with your tokens, which are delimited by '\n'
}

これを機能させるにはQFile、、、QStringを含める必要があります。幸運を!QTextStreamQStringList

于 2013-02-05T20:58:03.583 に答える
0
struct QA {
    vector<string> questionLines;
    vector<string> answerLines;
};

vector<string> getLines(istream& is) {
    vector<string> lines;
    string line;
    do {
        getline(is, line);
        lines.push_back(line);
    } while(!line.empty())
    return lines;
}

istream operator>>(istream& is, QA& qa) {
    qa.questionLines = getLines(is);
    qa.answerLines = getLines(is);
}
于 2013-02-05T20:58:14.277 に答える