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重写您的删除函数,您应该不会有问题