Как мне разобрать файл с разрывами строк как разделитель в C++?
Мне было интересно, как я могу разделить текстовый файл на части и сохранить группы строк как одну строку. Например:
У меня есть текстовый файл вопросов, некоторые из которых состоят из нескольких строк. После переменного числа строк (в зависимости от того, сколько строк занимает вопрос) следует пустая строка, затем ответ, затем другой вопрос (который также может быть длиннее 1 строки), пустая строка, ответ.
Примерно так: где "q" - это строки, которые должны храниться как одна строка, а "a" также должна быть одна строка:
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
aaaaaaaaaaaaaaaaaaaaaaa
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Я пытался читать построчно, комбинируя string line + line
если line != ""
, Но это стало запутанным и грязным, и я не мог заставить его работать правильно.
Я просто хочу хранить первый набор q
в виде одной строки и положить его в vector[0]
и первый набор a
в vector[1]
, Второй набор q
в vector[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;
}
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;
}
Если вы используете 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
, QTextStream
а также QStringList
чтобы это работало. Удачи!
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);
}