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 回答