【问题标题】:Writing a QVector to a text file in Qt在 Qt 中将 QVector 写入文本文件
【发布时间】:2015-02-27 07:09:05
【问题描述】:

我正在尝试编写一个程序,该程序读取包含多行 512 个元素的文本文件。这些是由制表符分隔的数字,文件的第一行包含有关文件本身的一般信息。这是它的样子:

512 测量时间:2014 年 6 月 12 日星期四 18:35:44 评论:无
2.4155 1.60983 1.08339 0 2.13321 0 0.848402 0 0.747692 0 0.146487 0 1.98062 0 0.846876 0 1.87991 0.117494 0 0 0 0 1.6907 0 0 0 0.0671397 0.256352 1.33974 1.4313 1.17494 0 0 0 1.83566 0 2.54826 0 0 0 0 0 1.80819 0 0 0 0 0 4.78523 0 1.99283 0 2.63676 0 2.19272 0 0.962844 0.256352 0.762951 0.581369 0 0 0 0.689708 1.38552 2.38193 1.11391 3.22118 0.712596 0.508125 0 0 0 0.842298 0 0.794995 0.967422 0.820935 0.0534066 2.67338 0

等等等等

512 列中的每一列都代表一个单独的数据流,并且随着时间的推移对行进行采样。该程序计算数据的积分,以便它吐出一个包含 512 个元素的向量,每个元素是相应列中所有数据的总和。

整体部分工作正常,我可以使用 qDebug 打印向量的输出,但是当我尝试将向量写入文本文件时出现错误。

这是我正在使用的代码:

void MainWindow::on_pushButton_clicked()

QVector<double> SingleLineData;
SingleLineData.resize(512);
QString test;
QString inputfile = QFileDialog::getOpenFileName(
            this,
            tr("Open File"),
            "/Users",
            "All files (*.*)"
            );

if(inputfile != ""){
QFile file(inputfile);


if(!file.open(QFile::ReadOnly)){
   }
QTextStream in(&file);


    double buffer;

    while(!file.atEnd()){
        in.readLine();
        for(int i=0; i<512; i++){
            in >> buffer;
            SingleLineData[i]+=buffer;
        }
    }

}
    qDebug() << SingleLineData;

// ************* 文件输出 ****************************** ********************

QString filename = "/Users/Mitch/Desktop/integral.txt";
QFile fileout(filename);
if (fileout.open(QFile::ReadWrite | QFile::Text)){
}
     QTextStream out(&fileout);
     out << SingleLineData;
     fileout.close();

}

收到的错误是:

错误:二进制表达式的操作数无效(“QTextStream”和“QVector”) 和 候选函数不可行:第一个参数没有从 'QVector' 到 'const void *' 的已知转换;用 & 取参数的地址 QTextStream &operator

任何帮助将不胜感激! :)

【问题讨论】:

    标签: c++ qt qvector qtextstream


    【解决方案1】:

    这是迭代器方法。 QTextStream 的运算符未重载以接受向量。但是,它可以接受双精度数。

    QString filename = "/Users/Mitch/Desktop/integral.txt";
    QFile fileout(filename);
    if (fileout.open(QFile::ReadWrite | QFile::Text)){
     QTextStream out(&fileout);
     for (Qvector<double>::iterator iter = SingleLineData.begin(); iter != SingleLineData.end(); iter++){
         out << *iter;
     }
     fileout.close();
    }
    

    【讨论】:

    • 感谢 melevan,这似乎已经解决了错误。我认为现在的输出是十六进制,有什么方法可以将其转换为纯文本/常规数字?下面是输出的一个示例:0x7fd09306a0180x7fd09306a0200x7fd09306a0280x7fd09306a0300x7fd09306a0380x7fd09306a0400x7fd09306a0480x7fd09306a0500x7fd09306a0580x7fd09306a0600x7fd09306a0680x7fd09306a0700x7fd09306a0780x7fd09306a0800x7fd09306a0880x7fd09306a0900x7fd09306a0980x7fd09306a0a00x7fd09306a0a80x7fd09306a0b00x7fd09306a0b80x7fd09306a0c00x 跨度>
    • 所以我尝试在 iter 之前删除 *,当它只是普通的 iter 时,数据以十六进制打印不正确,但 *iter 很好。作为 C++ 的新手,我真的不明白为什么使用 * 使它工作,与指针有关?所以现在它可以打印出数字,但没有分隔符,无论如何要添加逗号和空格,如 122112、12121435、242425235 等
    • 好吧,就像在 out
    • @MitchellD 这叫做取消引用。您想打印迭代器指向的项目,而不是迭代器本身。您可以查看有关 STL-style iterators 的文档。您还应该阅读pointers
    • @thuga 好的,这是有道理的。非常感谢,我一定会查看文档:)
    【解决方案2】:

    正如错误消息所说,没有QTextStream 重载需要QVector&lt;double&gt;,但有double。所以只需遍历元素并单独蒸它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2023-02-08
      相关资源
      最近更新 更多