2015-05-21 3 views
0

Объяснение моей цели:
В моей программе есть два раздела первого чтения два слова от пользователя (второе слово означает первый) и сохранить эти слова в двух текстовых файлах, вторая секция показывает или удаляет слова как желание пользователя.Проблема с удалением текста в файле

Что мой вопрос ?:
моя программа работает отлично, но после нескольких дней будет что-то подобное произойдет:
, когда я пытаюсь удалить два слова из .txt файлов (я имею в виду 1 слово со смыслом его) первое слово будет удаляться, но второе слово (значение) не будет удаляться, это звучит как .txt-файл, поврежденный только тем, что исправляет каждую вещь, удаляет этот текстовый файл и создает новый, и это очень раздражает, что означает потерять всю информацию
примечание: первое слово а второе слово - в отдельных файлах. второе слово все еще может показать.

что я пробовал ?:
Я пытаюсь проверить, что это текстовый файл второго слова, открытый или закрытый. похоже, что он откроется или закроется в нужное время.
убедитесь, что если текстовый файл доступен только для чтения. это не было.
я не знаю, что на самом деле здесь происходит :(!!!!
вот его мой код удаления я упускаю что-то?

#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(); 
} 

Я на окнах 8,1

я замечаю что-то новое сейчас когда я пытаюсь удалить всю информацию во втором файле .txt, размер файла будет равен 3 байтам, а не 0 байтам.

+1

Возможно, текстовый файл открыт в какой-либо программе (другая программа или, возможно, экземпляр этого). Поскольку, похоже, что вы работаете в Windows, вы можете использовать команду 'openfiles' или Process Explorer из SysInternals, чтобы проверить, какие файлы открыты для каких приложений. В прежние времена утилита «oh» из Resource Kit предоставляла такую ​​же функциональность. –

+0

какая программа? нет программы для работы с этим файлом – Raminlich

+0

Я бы сохранил ваш словарь в одном файле, где у вас есть определение слова \ n "" таким образом, когда вы удаляете строку, слово - это одно, которое требует определения. – NathanOliver

ответ

0

3 байта для пустого файла в противном случае могут совпадать с UTF-8 BOM (не говоря о том, что он не знает указанных байтов, но это сильный намек). Ваше удаление fu nction может быть прекрасным (хотя вы должны сделать фильтр для фильтрации другой функции для ясности и DRY), но будет работать только с символом ascii, поскольку вы полагаетесь на std :: i/ofstream и std :: string.

Возможно, что вы создаете файл с QFile, и вы добавляете «значение», содержащее символы не-ascii, и, таким образом, QFile автоматически преобразует файл в UTF-8 с префиксом спецификации.

Не могли бы вы обновить свое сообщение с помощью методов создания/обновления файлов, если вы не уверены в этом?

[Изменить] Другой вариант заключается в том, что вы пишете не ascii-символы с потоком, что, вероятно, приведет к тому, что «значение» не будет найдено, и, следовательно, файл будет полностью реплицирован.

+0

Здесь я помещаю полный код с новыми изменениями. – Raminlich

+0

@Raminlich on_Enter_clicked() кажется вашей функцией обновления, и, как вы догадались, вы используете QFile + QTextStream.Попробуйте переписать функцию удаления с помощью QFile вместо ifstream, и вы должны быть в порядке –

Смежные вопросы