QTextStream读取字符串直到tab

时间:2015-01-08 10:43:49

标签: c++ qt 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

3 个答案:

答案 0 :(得分:3)

如果您真的想以流方式进行,另一个选择是创建自定义TextStream并覆盖&gt;&gt;操作

#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 :(得分: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().

建议:如果要生成文件,请不要在文件名之间使用空格。使用下划线。

答案 2 :(得分:0)

您可以阅读有关QTextStream流运营商的Qt文档:

  

QTextStream&amp; QTextStream :: operator&gt;&gt;(QString&amp; str)

     

从流中读取一个单词并将其存储在str中,然后返回一个   引用流。单词由空格分隔(即全部   QChar :: isSpace()返回true的字符。

因此,此运算符从流中读取由空格分隔的单词。没有办法改变这种情况下的分离字符。所以你最好坚持使用QString::split()方法。或者将文件名更改为不包含空格(如果可能),并使用空格分隔文件名。