Russian Qt Forum
Сентябрь 23, 2024, 22:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись в файл / чтение из файла  (Прочитано 3071 раз)
puh
Гость
« : Май 30, 2014, 07:55 »

Добрый день.
Необходимо записать в файл 70.000.000 штук 32-хбитных данных, и далее их вычитать.
Делаю это следующим образом (для примера записываю просто счетчик и проверяю затраченное время):
Код:
    int size_mass = 70000000;
    QString fileName = QFileDialog::getSaveFileName(this, "Select one .hex file for save massive", "",  "Hex files (*.hex)");
     if (!fileName.isEmpty())
     {
         QFile file(fileName);
         if (!file.open(QFile::WriteOnly | QFile::Text))
         {
             QMessageBox::warning(this, "qwerty", tr("Cannot write file %1:\n%2.").arg(fileName).arg(file.errorString()));
         }
         else
         {
             QTime *timer = new QTime();
             timer->start(); // ----------------------------------

             QTextStream out(&file);
             for(int i=0; i<size_mass; i++)
             {
                 out << (quint32)i;
                 out << "\n";
             }
             file.close();

             timerCounter = timer->elapsed(); // ----------------------------------
             qDebug() << "timerCounter=" << timerCounter;
         }
         if (!file.open(QFile::ReadOnly | QFile::Text))
         {
             QMessageBox::warning(this, "qwerty", tr("Cannot read file %1:\n%2.").arg(fileName).arg(file.errorString()));
         }
         else
         {
             counter = 0;
             QTime *timer = new QTime();
             timer->start(); // ----------------------------------

             while(1)
             {
                 file.readLine();
                 if( file.atEnd() )
                     break;
                 counter++;
             }
             file.close();

             timerCounter = timer->elapsed(); // ----------------------------------
             qDebug() << "timerCounter=" << timerCounter << " counter=" << counter;
         }
     }
В итоге запись занимает порядка 90-92 секунд, а чтение чуть быстрее - 80-82 секунды.

Так вот вопрос, можно ли сделать это все намного быстрее? Процесс записи даже не очень важен, а вот процесс чтения хочется сделать пошустрее.
Записан
OKTA
Гость
« Ответ #1 : Май 30, 2014, 09:35 »

Попробуй обычный FILE/fopen/fclose/fputs/fgets. Попробовал у себя - работает порядочно быстрее, чем QFile  Улыбающийся
Записан
puh
Гость
« Ответ #2 : Май 30, 2014, 11:46 »

Проверил, действительно быстрее стало.
Но проблема еще не решена до конца.
Дело в том, что в файле будут записываться uint32 в текстовом виде, и они могут выглядеть так:
0
1
123456
7
, т.е. каждая строка может иметь разное количество символов.
В "моем первом" варианте я после вычитывания строки с помощью readLine() могу потом применить преобразование QString::toUint() и получу нужный мне uint32.
А как быть во втором случае чота я не пойму, как из массивов char* с разной длиной получить uint32. Непонимающий Непонимающий

Написав так:
char *s;
char ff[16];
s = fgets(ff, 16, f);
я получаю s как массив char'ов, в котором находятся коды символов из строки файла, причем каждый раз разной длины. Что мне с ним сделать чтобы получить из него uint32???
« Последнее редактирование: Май 30, 2014, 11:59 от puh » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #3 : Май 30, 2014, 12:02 »

я получаю s как массив char'ов, в котором находятся коды символов из строки файла, причем каждый раз разной длины. Что мне с ним сделать чтобы получить из него uint32???
std::atoi
Записан
puh
Гость
« Ответ #4 : Май 30, 2014, 18:55 »

Спасибо за подсказку, очень помогли.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 22.