C++ 删除文件中的文本时出现问题

C++ 删除文件中的文本时出现问题,c++,qt,file,text,C++,Qt,File,Text,解释我的目的: 我的程序有两个部分,第一部分从用户处读取两个单词(第二个单词是第一个单词的意思),并将这些单词保存在两个文本文件中。第二部分根据用户的需要显示或删除单词 我的问题是什么?: 我的程序运行得很好,但几天后会发生类似的事情: 当我试图从.txt文件中删除两个单词时(我指的是一个有其含义的单词),第一个单词将被删除,但第二个单词(含义)不会被删除,这听起来像是.txt文件损坏了。唯一能解决所有问题的方法是删除该文本文件并创建一个新文件,这非常烦人,意味着丢失所有信息 注意:第一个单词和

解释我的目的:
我的程序有两个部分,第一部分从用户处读取两个单词(第二个单词是第一个单词的意思),并将这些单词保存在两个文本文件中。第二部分根据用户的需要显示或删除单词

我的问题是什么?:
我的程序运行得很好,但几天后会发生类似的事情:
当我试图从.txt文件中删除两个单词时(我指的是一个有其含义的单词),第一个单词将被删除,但第二个单词(含义)不会被删除,这听起来像是.txt文件损坏了。唯一能解决所有问题的方法是删除该文本文件并创建一个新文件,这非常烦人,意味着丢失所有信息
注意:第一个单词和第二个单词在不同的文件中。第二句话仍然能够表现出来

我试了什么?:
我试图检查第二个word文本文件是否打开或关闭。听起来它会在正确的时间打开或关闭。
检查文本文件是否为只读。那不是。
我不知道这里到底发生了什么:(!!!!
这是我的删除代码我是不是遗漏了什么

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <fstream>
#include <QFile>
#include <QTextStream>
#include <QIODevice>
#include <QDebug>
#include <QMessageBox>
#include <QProcess>
#include <iostream>
#include <string>
#include <unistd.h>

using namespace std;
void newFunc();
void restartApp();
void makeFa();
int xy=-1;

ifstream sfile("en.txt");




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

MainWindow::~MainWindow()
{


    delete ui;
}
void newFunc(){
    QFile check("EnTemp.txt");
    if(check.exists()){

    }
    else{
        ofstream EnTemp("EnTemp.txt");

    }
}


void restartApp()
{
    qApp->quit();
    QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
}


void MainWindow::on_Enter_clicked()
{
    if((ui->InEN->text().isEmpty()) || (ui->InFa->text().isEmpty())){
        QMessageBox msg;
        msg.setText("Fields are empty");
        msg.exec();

}
    else{
    QString en,fa;
    en=ui->InEN->text();
    fa=ui->InFa->text();

    // saving EN words

    QFile dataE("en.txt");
    dataE.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream streamE(&dataE);
    streamE<<en<<"\r\n";
    dataE.close();

    // saving FA words

    QFile DataF("fa.txt");
    DataF.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream streamF(&DataF);
    streamF.setCodec("UTF-8");
    streamF<<fa<<"\r\n";
    DataF.close();

    ui->InEN->clear();
    ui->InFa->clear();



}
}
void MainWindow::on_Next_clicked()
{
    QFile EnTemp("EnTemp.txt");
    EnTemp.open(QIODevice::WriteOnly);
    QTextStream GetTemp(&EnTemp);
    if(!sfile.eof()){
    string get;
    getline(sfile,get);
    ui->ShowEn->setText(QString::fromStdString(get));
    ui->ShowFa->clear();
    xy++;
    GetTemp<<xy;
    EnTemp.close();
}
    else{
        restartApp();
    }
}


void MainWindow::on_mean_clicked()
{
    cout<<xy;
    QFile openFa("fa.txt");
     QString getFa;
    openFa.open(QIODevice::ReadWrite);
    QTextStream pointfa(&openFa);
    pointfa.setCodec("UTF-8");
    int forword=0;
    while(forword<=xy){
        getFa=pointfa.readLine();
        forword++;
    }
    ui->ShowFa->setText(getFa);
    openFa.close();
}

void MainWindow::on_delete_2_clicked()
{
           makeFa();
           ofstream tempE;

    if(!ui->ShowEn->text().isEmpty() | !ui->ShowFa->text().isEmpty())
    {
    QMessageBox msg;
    int ret;
    msg.setText("Are you sure you want to delete this words?");
    msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    msg.setIcon(QMessageBox::Warning);
    ret= msg.exec();
    switch(ret){
    case QMessageBox::Yes:
        QString input;
        input=ui->ShowEn->text();
        string line;
        ifstream DataE;

        DataE.open("en.txt");
        tempE.open("tempE.txt");
        while(getline(DataE,line)){
            if(line != input.toStdString()){
                tempE<<line<<"\r\n";
            }
        }
        QString inputF;
        inputF= ui->ShowFa->text();
        string lineF;
        ifstream DataF;
        ofstream tempF("tempF.txt");
        DataF.open("fa.txt");
        while(getline(DataF, lineF)){
            if( lineF != inputF.toStdString()){
                tempF<<lineF<<"\r\n";
            }
        }


        DataE.close();
        DataF.close();
        tempE.close();
        tempF.close();
        sfile.close();

        remove("en.txt");
        remove("fa.txt");

        rename("tempE.txt", "en.txt");
        rename("tempF.txt", "fa.txt");



        break;
    }

    }
    else{
        QMessageBox mass;
        mass.setText("Fields are empty");
        mass.exec();
    }
    restartApp();

}

void MainWindow::on_Restore_clicked()
{
    xy= 0;
    int reach=0;
    string get;
    QString s;
    ifstream openTemp("EnTemp.txt");
    openTemp>>xy;
    while(reach<=xy){
        getline(sfile,get);
        reach++;
    }
    ui->ShowEn->setText(QString::fromStdString(get));

}
void makeFa(){
    QFile tempF;
    tempF.setFileName("tempF.txt");
    tempF.open(QIODevice::ReadWrite | QIODevice::Append);
    QTextStream stream(&tempF);
    stream.setCodec("UTF-8");
    tempF.close();
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
void newFunc();
void restartApp();
void makeFa();
int xy=-1;
ifstream sfile(“en.txt”);
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
newFunc();
用户界面->设置用户界面(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void newFunc(){
QFile检查(“EnTemp.txt”);
if(检查.exists()){
}
否则{
流EnTemp(“EnTemp.txt”);
}
}
void restartApp()
{
qApp->quit();
QProcess::StartDetailed(qApp->arguments()[0],qApp->arguments());
}
void main window::在输入时单击()
{
如果((ui->InEN->text().isEmpty())| |(ui->InFa->text().isEmpty()){
QMessageBox消息;
msg.setText(“字段为空”);
msg.exec();
}
否则{
QString-en,fa;
en=ui->InEN->text();
fa=ui->InFa->text();
//保存英语单词
QFile数据文件(“en.txt”);
open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream流(&dataE);
流光清晰();
xy++;
GetTempShowFa->text().isEmpty())
{
QMessageBox消息;
int ret;
msg.setText(“您确定要删除此单词吗?”);
msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msg.setIcon(QMessageBox::Warning);
ret=msg.exec();
开关(ret){
案例QMessageBox::是:
QString输入;
输入=用户界面->显示->文本();
弦线;
ifstreamdatae;
打开数据源(“en.txt”);
tempE.open(“tempE.txt”);
while(getline(DataE,line)){
if(line!=input.toStdString()){

tempE3个字节,否则一个空文件可能与匹配(不是说它是在不知道所说的字节的情况下,但这是一个强烈的提示)。您的删除功能可能很好(尽管为了清晰起见,您应该让文件过滤另一个功能,并且),但只能使用ascii字符集,因为您依赖std::i/of流和std::string

可能是(同样,不确定,只是胡乱猜测)您正在使用QFile创建一个文件,并且您输入了一个包含非ascii字符的“含义”,因此QFile会自动将该文件转换为以BOM为前缀的UTF-8

如果你不确定这条线索,你介意用文件创建/更新方法更新你的帖子吗


[编辑]另一个选项是,您正在使用ofstream写入非ascii字符,这可能会导致找不到“含义”,从而完全复制文件。

可能文本文件在某个程序(其他程序或此程序的实例)中打开。由于您似乎正在Windows中工作,您可以使用SysInternals中的
openfiles
命令或Process Explorer来检查哪些应用程序打开了哪些文件。在过去,资源工具包中的
oh
实用程序提供了相同的功能。什么程序?没有可使用此文件的程序我将存储您r字典在一个文件中,您有
单词定义“\n”
,这样当您删除该行时,单词是一个,它的定义是一个。什么是“rn”?您的意思是写“\r\n”?有人为我编辑到rn原始代码是\r\n\n@Raminlich在_输入_单击()似乎是您的更新函数,正如猜测的那样,您正在使用QFile+QTextStream。尝试使用QFile而不是ifstream重写您的删除函数,您应该不会有问题