0

同じファイルから読み書きしようとしましたが、奇妙な動作が発生します。コード例は次のとおりです。

メインウィンドウ.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextStream>
#include <QFile>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_textEdit_textChanged();

private:
    QFile *File;
    QTextStream *FileStream;
    QString TextFromFile;
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

メインウィンドウ.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    File = new QFile;
    File->setFileName("test.txt");
    File->open(QIODevice::ReadWrite | QIODevice::Text);
    FileStream = new QTextStream(File);

    TextFromFile = FileStream->readAll();
    ui->textEdit->setText(TextFromFile);

    File->close();
    File->open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_textEdit_textChanged()
{
    *FileStream << ui->textEdit->toPlainText();
    FileStream->flush();
}

たとえば、次のように入力する
ここに画像の説明を入力
と、ファイルは次のように変更されます:
ここに画像の説明を入力
しかし、これが必要です:
ここに画像の説明を入力
私の目的は、テキスト編集に文字を入力するたびにファイルを上書きすることです。

4

1 に答える 1

3

毎回ファイルを書き換える必要がある場合は、ポインターなしでこれを実行してみてください。何かのようなもの:

void MainWindow::on_textEdit_textChanged()
{    
    QElapsedTimer timer;
    timer.start();  
    QFile file("test.txt");
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
        qDebug() << "failed open";
    else
    {
        QTextStream out(&file);
        out << ui->textEdit->toPlainText();
    }
    qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
}

QFileデストラクタは、スロットの最後でファイルを閉じます。

私の場合の出力:

The slow operation took 0 milliseconds 
The slow operation took 0 milliseconds 

もちろんビッグデータでは遅くなりますが、それが通常のアプローチだと思います。

おそらく、それでうまくいくはずだと思ったでしょうQIODevice::Truncateが、それは間違っています。ドキュメントから:

可能であれば、デバイスは開かれる前に切り捨てられます。デバイスの以前の内容はすべて失われます。

しかし、同じストリームを使用しているため、コードでは機能しません。毎回ファイルを開くのではなく、毎回新しい単語を追加するだけです。そしてflush()、デバイスに書き込まれるのを待っているバッファリングされたデータをフラッシュします。

于 2014-12-22T19:07:57.493 に答える