LINUX.ORG.RU

Qt C++ после перезаписи файла зависает программа - C++ Qt

 


0

1

Доброго времени суток. Проблема такая, имеется функция Filtering_all_date() код:

QFile All_history("./History/All/history.his");
if(All_history.open(QFile::ReadOnly)){
    QString write_new_line = All_history.readLine();
    QString delete_First_Line = All_history.readAll();
    QFile overWrite_History_Today("./History/Today/history.his");
    if(overWrite_History_Today.open(QFile::ReadOnly)){
        QString write = write_new_line;
        write_new_line += overWrite_History_Today.readAll();
        QFile Write_today_history("./History/Today/history.his");
        if(Write_today_history.open(QFile::WriteOnly)){
            QTextStream Write_text(&Write_today_history);
            Write_text<<write_new_line;
            QStringList lst;
            lst<<delete_First_Line;
            lst.removeAt(0);
            foreach(QString str,lst){
                delete_First_Line=str;
            }
            QFile OverWrite_File_AllHistory("./History/All/history.his");
            if(OverWrite_File_AllHistory.open(QFile::WriteOnly)){
                QTextStream text(&OverWrite_File_AllHistory);
                text<<delete_First_Line;
            }
            Write_thismonth.close();
            OverWrite_File_AllHistory.close();
            All_history.close();
            overWrite_History_Today.close();
        } 
    } 
}
Потом я вызываю цикл for в другой функции код:
int i;
for(i=0;i=10;i++){
    Filtering_all_date()
}
И когда доходит до цикла функция выполняется столько сколько надо в данном случае 10 раз и программа зависает, а в компиляторе во вкладке «вывод приложения» выводятся сообщения: QIODevice::read (QFile, "./History/All/history.his"): device not open Что делать? подскажите новичку.



Последнее исправление: Egor12 (всего исправлений: 1)

Это пипец я извиняюсь.

  1. Положи свой текст скажем на pastebin.com - читать же не возможно.
  2. Если я правильно понял ты в цикле открываешь пишешь и закрываешь файл? Если это так - то в корне не верно - так делать нельзя. Надо открыть файл создать поток ит в цикле передовать в функцию указатель(или ссылку) на него, далее на твой выбор:
    • если нет уверенности что программа не упадет посреди цикла - делаешь flush каждую итерацию (но будет тормозить немного).
    • сделать flush после цикла и закрыть или просто закрыть - теоретически он сам сделает flush, но когда будет время.
Silerus ★★★★
()

Вы открываете ./History/Today/history.his дважды.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Egor12

да открыли, создали поток, указатель передали в фунцию что то типа этого должно быть:

func(QTextStream &stream);
....
открываем файл, создаем поток
for(int i=0;i....){
func(stream);
}
file.close();

Silerus ★★★★
()
Ответ на: комментарий от Dendy

Он травит больше одного объекта QFile на один путь. Лень вчитываться в этот жуткий код, но ругань программы намекает на то что я прав.

erfea ★★★★★
()
Ответ на: комментарий от Silerus

Нет. Есть два файла: один из папки All и один из папки Today. Из первого надо переписать файлы во второй

Egor12
() автор топика
Ответ на: комментарий от Egor12

Цикл выполняется бесконечно, переменная присваивается 10 и кастируется к true. Правильно так: for(i=0;i!=10;i++). Или опечатка или стоит прочитать хоть какую-нибудь книжку по C++.

Dendy ★★★★★
()
Последнее исправление: Dendy (всего исправлений: 2)
Ответ на: комментарий от Egor12

ты всё таки посмотри, как сравнение в С++ делается.

ckotinko ☆☆☆
()
Ответ на: комментарий от Egor12

да заранее открываем, вы же пишете в цикле? зачем их по 10 раз открывать закрывать - на это время тратится и прилично.

Silerus ★★★★
()
Ответ на: комментарий от Egor12

overWrite_History_Today("./History/Today/history.his");
QFile Write_today_history("./History/Today/history.his");

/0

erfea ★★★★★
()
Ответ на: комментарий от Silerus

Ну это я уже понял что нужно все до цикла открывать.

Egor12
() автор топика

Нефиг открывать на запись, открытый на чтение файл. Нефиг даже создавать два QFile на один файл в ФС. ХЗ как это разруливает Qt, но это говнокод и потому не работает. Тред можно закрывать.

erfea ★★★★★
()
Ответ на: комментарий от Egor12

for(i=0;i=10;i++)

Тебе же объяснили, вечный цикл. Вместо проверки ты делаешь присвоение. Должно быть for(i=0; i<10; i++) Учи матчасть.

anonymous
()
Ответ на: комментарий от Egor12

Ну хотя бы что не понадобится 3 поста (2 моих) с указанием на одну причину. Ну а так чо, удачи, учись и будь внимательнее.

erfea ★★★★★
()
Последнее исправление: erfea (всего исправлений: 1)
Ответ на: комментарий от anonymous

Да я понял уже что дело в открытых одних и тех же файлах, в бесконечном цикле и в открытии файлов в цикле.

Egor12
() автор топика
Ответ на: комментарий от erfea

Да буду уж учиться на ошибках. Спасибо всем за помощь!

Egor12
() автор топика

for(i=0;i=10;i++)

Ну добавить ты qDebug() << i; Что увидишь?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от anonymous

О, анонимус, пока я писал тебе этот красивый ответ, сам понял, что мое предыдущее высказывание было неверным, ибо глаз мой замылился этим неправославным 1С, где выражение присваивания ничем не отличается от выражения проверки на равевнство. Но я уже написал красивое (по православному lorcode) объяснение, пусть останется для ТС-а, ему полезно.

Итак... Почему будет бесконечный цикл.

Теория тут

Все просто.
Оператор цикла for принимает три выражения (через точку с запятой).

  • Первое - инициализация цикла.
  • Второе - проверка на необходимость продолжить цикл.
  • Третье - то, что выполняется перед каждой итерацией, начиная со второй.

Таким образом, запись ТС-а

int i;
for(i=0;i=10;i++){
    Filtering_all_date()
}
будет обработана так:

  • Инициализация цикла, i=0
  • Первая итерация цикла, вызов Filtering_all_date()
  • Вызов третьего выражения for, i++ / i теперь равен 1
  • Проверка необходимости выполнения следующей итерации цикла (второе выражение for), тут работают хитрости проверок на булево: i=10 - это выражение присвоит i 10 и вернет его же, 10. А 10 - это не ноль, именно который есть ложь при неявном преобразовании в булево. Поэтому второе выражение for на проверку необходимости следующей итерации вернет true, присвоив i=10.
bvn13 ★★★★★
()
Ответ на: комментарий от bvn13

То, что ты описал, называется do {...} while (...);

http://cppstudio.com/post/361/

Не будешь же ты утверждать, что тело цикла

for (i=42; i<10; i++)
{
    ...
    kokoko
    ...
}
выполнится хоть один раз.

justAmoment ★★★★★
()
Последнее исправление: justAmoment (всего исправлений: 1)
Ответ на: комментарий от justAmoment

перечитал, проверил, да, выражение 2 проверяется перед каждой итерацией, даже перед первой. т.е. for (i=42; i<10; i++){} не выполнится ни разу.

bvn13 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.