【问题标题】:How to "write" backspace in QTextStream?如何在 QTextStream 中“写”退格键?
【发布时间】:2017-11-06 10:41:17
【问题描述】:

我正在使用 QTextStream 编写一个简单的 CSV 数据导出,但每行末尾都会出现一个多余的逗号。如何删除 QTextStream 中最后写入的符号并在删除后继续写入数据?

【问题讨论】:

  • 这听起来像是 XY 问题。一旦将字符写入流中,就无法擦除它。您需要在循环中添加条件以检查最后一列或类似的检查以防止逗号被写入。
  • 有些字段是有条件写入的,无法知道下一个字段是否会写入,所以无法知道是否写入分隔符。
  • 你能在字段前写逗号吗...所以流
  • 如果无法知道该字段是否会被写入,那么也无法知道该字段是否是第一个。
  • 类似于ostream_joiner?

标签: c++ csv qt5 qtextstream


【解决方案1】:

简短的回答是你不能,它是一个流(没有一些缓冲区操作,我认为你不想这样做)。没有删除一个字符这样的事情——它已经被发送到“下游”(想想终端)。

您可能希望删除原始文件中的多余逗号,或者逐行读取 CSV 并在将逗号写入输出流之前将其去掉。您仍然可以使用 QTextStream 作为输入流来逐行读取,但在将逗号传递给输出流之前,您必须自己去掉逗号。

【讨论】:

    【解决方案2】:

    没有流操作“unwrite”,所以不能直接去掉逗号。你应该做的是确保你不写它。

    struct QStreamJoiner
    {
        QTextStream & ts;
        bool doComma = false;
        template<typename T>
        QStreamJoiner & operator<<(const T & value)
        {
            if (doComma++) ts << ',';
            ts << value;
            return *this;
        }
    }
    

    您可以在每一行的QTextStream 周围使用QStreamJoiner 之类的包装器,例如

    QTextStream out = ...;
    for (auto record : records)
    {
        QStreamJoiner joiner(out);
        joiner << record.field1;
        if (condition) joiner << record.field2;
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多