gpt4 book ai didi

c++ - QTextStream 将错误的数据写入文件

转载 作者:行者123 更新时间:2023-11-28 00:20:50 27 4
gpt4 key购买 nike

我尝试从同一个文件读取和写入,但出现奇怪的行为。这是示例代码:

主窗口.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();
}

所以当我输入例如这个:
enter image description here
文件将更改为:
enter image description here
但我需要这个:
enter image description here
我的目标是每次在文本编辑中键入字符时都覆盖文件。

最佳答案

如果您每次都需要重写文件,请尝试在没有指针的情况下执行此操作。像这样的东西:

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 应该可以解决问题,但这是错误的。来自文档:

If possible, the device is truncated before it is opened. All earlier contents of the device are lost.

但是在你的代码中它不起作用,因为你使用相同的流,你不会每次都打开你的文件,你每次都只是添加新的单词。 flush() 只是刷新所有等待写入设备的缓冲数据。

关于c++ - QTextStream 将错误的数据写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608844/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com