Как получить строку из текстового файла с библиотеками Qt - PullRequest
0 голосов
/ 02 марта 2012

Я хочу получить несколько строк из текстового файла.Я знаю, как получить всю строку текстового файла с помощью

QTextStream Stream (GEO); 
QString text;    
 do    
{    
text = Stream.readLine();  

}
while(!text.isNull());

Это прекрасно работает, чтобы получить весь текст в тексте QString, но мне просто нужны некоторые конкретные строки из текста, схематично, например:

if the text "start" appears in the Qstring text (or the QTextStream Stream) 

save the following text under QString First

until the text "end" appears

Может кто-нибудь сказать мне, как это сделать, или, может быть, даже привести небольшой пример?

1 Ответ

1 голос
/ 02 марта 2012

Одна вещь, которую вы можете использовать, это получить индексы «start» и «end» с помощью indexOf () и просто использовать:

QString x = "start some text here end";
QString s = "start";
QString e = "end"
int start = x.indexOf(s, 0, Qt::CaseInsensitive);  // returns the first encounter of the string 
int end = x.indexOf(e, Qt::CaseInsensitive);  // returns 21

if(start != -1) // we found it
    QString y = x.mid(start + s.length(), end);

или midRef, если вы не хотите создавать новый список. Возможно, вам придется обработать «конец», а в противном случае вы можете перейти от 0 к -1, что ничего не даст. Может быть (конец> начало? Конец: начало)

Редактировать: фигу. Если end == -1, это просто означает, что он будет возвращать все до конца (по умолчанию второй параметр равен -1). Если вы не хотите этого, вы можете вместо этого использовать мой пример и использовать какое-то выражение if при выборе «end»

Редактировать: заметил, что я пропустил документ, и это будет def. работа:

#include <QDebug>

int main(int argc, char *argv[]) {
    QString x = "start some text here end";
    QString s = "start";
    QString e = "end";
    int start = x.indexOf(s, 0, Qt::CaseInsensitive); 
    int end = x.indexOf(e, Qt::CaseInsensitive); 

    if(start != -1){ // we found it
        QString y = x.mid(start + s.length(), ((end - (start + s.length())) > -1 ? (end - (start + s.length())) : -1)); // if you dont wanna pass in a number less than -1
        or
        QString y = x.mid(start + s.length(), (end - (start + s.length()))); // should not be any issues passing in a number less than -1, still works

        qDebug() << y << (start + s.length()) << (end - (start + s.length()));
    }
}

Создает следующие результаты. Последние два числа - это то, где заканчивается «начало» и начинается «конец».

x = "начать с какого-нибудь текста здесь end" => "с каким-нибудь текстом здесь" 5 16

x = "конец текста" => без надписей

x = "начать тестирование начать текст здесь end" => "начать текст здесь" 13 22 * ​​1018 *

x = "начать тестирование, начать текст здесь" => "начать текст, здесь" 13 -14

Или вы можете сделать это, используя regEx. Написал для вас очень простой фрагмент:

#include <QDebug>
#include <QRegExp>

int main(int argc, char *argv[]) {
    QRegExp rxlen("(start)(.*(?=$|end))");
    rxlen.setMinimal(true); // it's lazy which means that if it finds "end" it stops and not trying to find "$" which is the end of the string 
    int pos = rxlen.indexIn("test start testing some text start here fdsfdsfdsend test ");

    if (pos > -1) { // if the string matched, which means that "start" will be in it, followed by a string 
        qDebug() <<  rxlen.cap(2); // " testing some text start here fdsfdsfds" 
    }
}

Это работает, даже если у вас уже есть «конец» в конце, тогда он просто разбирает до конца строки. Наслаждайтесь!

...