やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

QFileでファイルの先頭に追記できなかった(ランダムアクセス)

 ファイルの先頭に追記したかった。

成果物

github.com

ソースコード

 要点を抜粋。

#include <QFile>
#include <QDir>
#include <QTextStream>
#include <QMessageBox>
#include <QDebug>
#include <QDateTime>


void MainWindow::on_lineEdit_returnPressed()
{
    QString filePath = QDir(QApplication::applicationDirPath()).filePath(tr("memo.tsv"));
    QFile file(filePath);
    //if (!file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
    if (!file.open(QIODevice::WriteOnly | QIODevice::Append))
    {
        QMessageBox::information(this, tr("ファイルが開けませんでした"), file.errorString());
        return;
    }
    file.seek(0);

    QDateTime dt = QDateTime::currentDateTime();
    QString line = dt.toString("yyyy-MM-dd HH:mm:ss.zzz") + tr("\t") + ui->lineEdit->text();
    QTextStream out(&file);
    out.seek(0);
    out << line << endl;
    qDebug() << line;
    file.close();
}

調べる

 ランダムアクセスするときはテキストモードでなくバイナリモードでないとダメみたい。

 C言語ならfopen()関数にモードを指定するときbを与えるんだったっけ? Qtではバイナリモードらしきものが存在しない。QIODevice::Textを付与しなければいいのか?

所感

 ファイルを最初から作成し直すことでしか先頭に追記できないみたい。なら日にちごとにファイル分割したり、メモリ上でソートしたほうがいいか。DBにするのが最善か。