1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
1

Запись и чтение большого кол-ва информации QByteArray

31.07.2016, 12:29. Показов 3797. Ответов 44
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Пишу программу - шифратор. Столкнулся с проблемой: программа шифрует файлы размером максимум 1023 мб, файлы весом 1гб и больше мгновенно очищает. На форуме прочитал, что надо читать файл блоками, но не понял, как это реализовать. Вот код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
QString path = ui->Path->text();
   QString key = ui->key->text();
   QFile file(path);
   QFile file2(path);
   if (!file.open(QFile::ReadOnly))
   {
          QMessageBox msg;
           msg.setInformativeText("Произошла ошибка чтения");
           msg.setWindowTitle("Ошибка");
           ui->sb->showMessage("Ошибка чтения");
           msg.setIcon(QMessageBox::Critical);
           msg.exec();
   }
   QByteArray f1 = file.readAll();
   file.close();
      if (!file2.open(QFile::WriteOnly))
      {
           QMessageBox msg;
           msg.setInformativeText("Произошла ошибка записи");
           msg.setWindowTitle("Ошибка");
           ui->sb->showMessage("Ошибка записи");
           msg.setIcon(QMessageBox::Critical);
           msg.exec();
      }
      QDataStream res(&file2);
      QByteArray keyde = key.toLocal8Bit();
      unsigned long long int pbmax = f1.size() / 1000;
      unsigned long long int pbact = 0;
      unsigned long long int pbmin = 0;
      ui->progressBar->setMinimum(pbmin);
      ui->progressBar->setMaximum(pbmax);
      ui->progressBar->setValue(pbact);
      ui->sb->showMessage("Начало шифровки/расшифровки...");
          for (int i = 0, j = 0,qw = 0; i < f1.size(); ++i)
                {
                    f1[i] = f1[i] ^ keyde[j++];
                    if (j == keyde.size()) j = 0;
                    qw++;
                    if (qw%1000)
                    {
                    pbact++;
                    ui->progressBar->setValue(pbact);
                    }
                    else;
                }
      ui->sb->showMessage("Шифровка/расшифровка окночена, запись...");
      res.writeRawData(f1,f1.size());
      file2.close();
      ui->sb->showMessage("Запись завершена, файл готов");
      QMessageBox msg;
      msg.setInformativeText("Шифровка/расшифровка завершена");
      msg.setWindowTitle("Готово");
      msg.setIcon(QMessageBox::Information);
      msg.exec();
      ui->progressBar->setValue(0);
Заранее спасибо!

Добавлено через 1 минуту
Извиняюсь код скопировался не полностью.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
QString path = ui->Path->text();
   QString key = ui->key->text();
   QFile file(path);
   QFile file2(path);
   if (!file.open(QFile::ReadOnly))
   {
          QMessageBox msg;
           msg.setInformativeText("Произошла ошибка чтения");
           msg.setWindowTitle("Ошибка");
           ui->sb->showMessage("Ошибка чтения");
           msg.setIcon(QMessageBox::Critical);
           msg.exec();
   }
   QByteArray f1 = file.readAll();
   file.close();
      if (!file2.open(QFile::WriteOnly))
      {
           QMessageBox msg;
           msg.setInformativeText("Произошла ошибка записи");
           msg.setWindowTitle("Ошибка");
           ui->sb->showMessage("Ошибка записи");
           msg.setIcon(QMessageBox::Critical);
           msg.exec();
      }
      QDataStream res(&file2);
      QByteArray keyde = key.toLocal8Bit();
      unsigned long long int pbmax = f1.size() / 1000;
      unsigned long long int pbact = 0;
      unsigned long long int pbmin = 0;
      ui->progressBar->setMinimum(pbmin);
      ui->progressBar->setMaximum(pbmax);
      ui->progressBar->setValue(pbact);
      ui->sb->showMessage("Начало шифровки/расшифровки...");
          for (int i = 0, j = 0,qw = 0; i < f1.size(); ++i)
                {
                    f1[i] = f1[i] ^ keyde[j++];
                    if (j == keyde.size()) j = 0;
                    qw++;
                    if (qw%1000)
                    {
                    pbact++;
                    ui->progressBar->setValue(pbact);
                    }
                    else;
                }
      ui->sb->showMessage("Шифровка/расшифровка окночена, запись...");
      res.writeRawData(f1,f1.size());
      file2.close();
      ui->sb->showMessage("Запись завершена, файл готов");
      QMessageBox msg;
      msg.setInformativeText("Шифровка/расшифровка завершена");
      msg.setWindowTitle("Готово");
      msg.setIcon(QMessageBox::Information);
      msg.exec();
      ui->progressBar->setValue(0);
Добавлено через 1 минуту
*Извиняюсь,
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2016, 12:29
Ответы с готовыми решениями:

Чтение/запись большого изображения БЫСТРО
Доброго времени суток! Я знаю способ как прочитать или изменить массив пикселей в любой...

Запись и чтение большого файла или области на диске
доброе время суток. если вопрос не по топику то подскажите где могут на него ответить. итак,...

Запись и чтение информации
&quot;Создать программное обеспечение ввода-вывода информации пользователя&quot; Люди добрые, помогите с...

Запись и чтение информации из БД
Подскажите как реализовать запись информации которая будет в textBox'ах в БД (например Access). И...

44
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
02.08.2016, 14:43 41
Author24 — интернет-сервис помощи студентам
Ну флаг сделай в классе окна: true, когда файл обрабатывается.
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
02.08.2016, 15:26 42
А сколько у тебя по времени шифруется 1 гиг? У меня 28 секунд.
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
02.08.2016, 18:11  [ТС] 43
Цитата Сообщение от alexu_007 Посмотреть сообщение
А сколько у тебя по времени шифруется
6 раза проверял: результаты очень разные, первые 2 по ~40сек, все последующие по ~25. С чем связано не знаю.

Добавлено через 1 час 23 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Ну флаг сделай в классе окна
Как? Просмотрел кучу инфы, ничего внятного не нашел.
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
02.08.2016, 18:18 44
Лучший ответ Сообщение было отмечено Алексей_Либанов как решение

Решение

Ну поле класса типа bool сделай и присваивай true, когда с файлом работаешь. При попытке закрытия будешь флаг проверять. И о processEvents() не забывай.
1
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
02.08.2016, 19:15  [ТС] 45
Спасибо всем огромное. Тему можно считать закрытой.
0
02.08.2016, 19:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2016, 19:15
Помогаю со студенческими работами здесь

Чтение и запись информации из файлов
в принципе все понятно , но нужна помощь с выводом массивов в консоль ,ибо все варианты которые я...

Чтение и запись информации с листа Excel
Ребята помогите пожалуста , у меня на форме 2 кнопки , кнопка-read и кнопка-write и ещё textbox....

Чтение и запись в файл информации об автомобилях
Здравствуйте всем. Не поможете с задачкой пожалуйста. Несколько часов уже с ней вожусь ничего не...

Запись и чтение в файл разнотипной информации
У меня есть информация такого типа:имя файла,дата создания, содержимое файла,подскажите как мне это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru