2015-01-08 2 views
2

У меня есть имена файлов, в которых есть пробел, но они разделены вкладками. Как я могу читать их один за другим, используя QTextStream?QTextStream читает строку до табуляции

Обычным способом будет расколот и табуляций (на самом деле любой QChar::isSpace()), который не то, что я хочу здесь:

QString s = "file 1.txt\tfile 2.txt"; 
QTextStream st(&s); 
st >> s1 >> s2; // <--- This won't work, it'll give me "file" and "1.txt" 

Прямо сейчас я использую QString::split() вместо QTextStream как обходной путь, но я скорее всего, используйте QTextStream.

+1

Как насчет замены каждого '\ t' на '\ n' и использования st.readLine()? – pwwpche

ответ

3

Если вы действительно хотите это сделать потоковым способом, еще один вариант - создать пользовательский TextStream и переопределить >> оператор.

#include <QString> 
#include <QStringBuilder> 
#include <QTextStream> 

class MyTextStream : public QTextStream { 
public: 
    MyTextStream(QString* str) : QTextStream(str) {} 

    MyTextStream& operator>>(QString & str) { 
    QChar ch; 
    while (!atEnd()) { 
     QTextStream::operator >>(ch); 
     if (ch == '\t') { 
     break; 
     } 
     str = str % ch; 
    } 
    return *this; 
    } 
}; 

int main() { 
    QString s1, s2; 
    QString s = "file 1.txt\tfile 2.txt"; 
    MyTextStream st(&s); 
    st >> s1 >> s2; // <--- s1 becomes "file 1.txt" and s2 becomes "file 2.txt" 
} 
1

Невозможно выполнить то, что вы хотите, используя QTextStream.

Пожалуйста, прочитайте ниже ссылке:

http://qt-project.org/doc/qt-4.8/qtextstream.html

Есть три основных способа использования QTextStream при чтении текстовых файлов:

Chunk by chunk, by calling readLine() or readAll(). 
Word by word. QTextStream supports streaming into QStrings, QByteArrays and char* buffers. Words are delimited by space, and leading white space is automatically skipped. 
Character by character, by streaming into QChar or char types. This method is often used for convenient input handling when parsing files, independent of character encoding and end-of-line semantics. To skip white space, call skipWhiteSpace(). 

Предложение: Если вы создаете файлы, пожалуйста, не» t используйте пробелы между именами файлов. Используйте подчеркивание.

0

Вы можете прочитать в документации Qt о QTextStream оператора потока:

QTextStream & QTextStream :: оператор >> (QString & ул)

Читает слово из потока и сохраняет его в str, затем возвращает ссылку на поток . Слова разделяются пробелами (т. Е. Все символов, для которых QChar :: isSpace() возвращает true).

Таким образом, этот оператор считывает слова из потока, которые разделены пробелами. Не существует способа изменить разделительный символ для этого случая. Поэтому вам лучше придерживаться метода QString::split(). или изменить имена файлов, чтобы не иметь пробелов (если возможно) и отдельных имен файлов по пробелам.

Смежные вопросы