3

我的文件名中有空格,但由制表符分隔。如何使用 a 一个一个地阅读它们QTextStream

正常的方式将由制表符和空格(实际上是 any 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.

4

3 回答 3

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"
}
于 2015-01-08T11:42:59.243 回答
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().

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

于 2015-01-08T11:02:56.113 回答
0

您可以从 Qt 文档中阅读有关QTextStream 流运算符的信息:

QTextStream & QTextStream::​运算符>>(QString & str)

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

因此,此运算符从流中读取由空格分隔的单词。对于这种情况,无法更改分隔符。所以你最好坚持这个QString::split()方法。或将文件名更改为没有空格(如果可能)并用空格分隔文件名。

于 2015-01-08T12:23:43.363 回答