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,

2

Решение

Если вы действительно хотите сделать это потоковым способом, другой вариант — создать пользовательский оператор 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"}
3

Другие решения

Невозможно сделать то, что вы хотите, используя 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().

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

1

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

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

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

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

0
По вопросам рекламы [email protected]