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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Внешняя сортировка прямым слиянием  (Прочитано 2261 раз)
nik23
Гость
« : Июнь 30, 2015, 12:41 »

Здравствуйте! Помогите,пожалуйста, решить проблему! Написал алгоритм внешней сортировки прямым слиянием. Почему то, если использовать стандартный сишные функции работы с файлами он работает, но при использовании QFile нет.
Вот код:
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
void straightSort (){
  int a1, a2, k, i, j, n;
  //FILE *mainFile, *subFile1, *subFile2;
 QFile mainFile("file.csv"), subFile1("subFile1.csv"), subFile2("subFile2.csv");

  n = 0;
 // mainFile = fopen(name,"r");
  mainFile.open(QIODevice::ReadOnly);
   // while ( !feof(mainFile) ) {
  while (!mainFile.atEnd()) {
      //fscanf(mainFile,"%d",&a1);
      mainFile.readLine();
      n++;
    }
    //fclose(mainFile);
  mainFile.close();
  k = 1;
  while ( k < n ){
    //mainFile = fopen(name,"r");
    mainFile.open(QIODevice::ReadOnly);
    //subFile1 = fopen("smsort_1","w");
   subFile1.open(QIODevice::WriteOnly);
    //subFile2 = fopen("smsort_2","w");
    subFile2.open(QIODevice::WriteOnly);
    //if ( !feof(mainFile) ) fscanf(mainFile,"%d",&a1);
    if (!mainFile.atEnd()){
        QString str = mainFile.readLine();
        a1 = str.toInt();
    }
    QMessageBox msgBox;
    msgBox.setText(QString::number(a1));
    msgBox.exec();

    //while ( !feof(mainFile) ){
    while (!mainFile.atEnd()){
     // for ( i = 0; i < k && !feof(mainFile) ; i++ ){
        for ( i = 0; i < k && !mainFile.atEnd() ; i++ ){
        //fprintf(subFile1,"%d ",a1);
        subFile1.write(QString::number(a1).toUtf8());
        subFile1.write("\n");
        //fscanf(mainFile,"%d",&a1);
        QString str = mainFile.readLine();
        a1 = str.toInt();
      }
     // for ( j = 0; j < k && !feof(mainFile) ; j++ ){
        for ( j = 0; j < k && !mainFile.atEnd() ; j++ ){
        //fprintf(subFile2,"%d ",a1);
        subFile2.write(QString::number(a1).toUtf8());
        subFile2.write("\n");
        //fscanf(mainFile,"%d",&a1);
        QString str = mainFile.readLine();
        a1 = str.toInt();
      }
    }
    //fclose(subFile2);
    subFile2.close();
   // fclose(subFile1);
    subFile1.close();
    //fclose(mainFile);
    mainFile.close();

    //mainFile = fopen(name,"w");
   mainFile.open(QIODevice::WriteOnly);
    //subFile1 = fopen("smsort_1","r");
    subFile1.open(QIODevice::ReadOnly);
    //subFile2 = fopen("smsort_2","r");
    subFile2.open(QIODevice::ReadOnly);

    //if ( !feof(subFile1) ) fscanf(subFile1,"%d",&a1);
    if (!subFile1.atEnd()){
        QString str = subFile1.readLine();
        a1 = str.toInt();
    }

    //if ( !feof(subFile2) ) fscanf(subFile2,"%d",&a2);
    if (!subFile2.atEnd()){
        QString str = subFile2.readLine();
        a2 = str.toInt();
    }

   // while ( !feof(subFile1) && !feof(subFile2) ){
    while (!subFile1.atEnd() && !subFile2.atEnd()) {
      i = 0;  j = 0;
      //while ( i < k && j < k && !feof(subFile1) && !feof(subFile2) ) {
          while ( i < k && j < k && !subFile1.atEnd() && !subFile2.atEnd()) {

        if ( a1 < a2 ) {
          //fprintf(mainFile,"%d ",a1);
          mainFile.write(QString::number(a1).toUtf8());
          mainFile.write("\n");
          //fscanf(subFile1,"%d",&a1);
          QString str = subFile1.readLine();
          a1 = str.toInt();
          i++;
        }
        else {
          //fprintf(mainFile,"%d ",a2);
          mainFile.write(QString::number(a2).toUtf8());
          mainFile.write("\n");
          //fscanf(subFile2,"%d",&a2);
          QString str = subFile2.readLine();
          a2 = str.toInt();
          j++;
        }
      }
      //while ( i < k && !feof(subFile1) ) {
        while ( i < k && !subFile1.atEnd() ) {
        //fprintf(mainFile,"%d ",a1);
        mainFile.write(QString::number(a1).toUtf8());
        mainFile.write("\n");
        //fscanf(subFile1,"%d",&a1);
        QString str = subFile1.readLine();
        a1 = str.toInt();
        i++;
      }
     // while ( j < k && !feof(subFile2) ) {
        while ( j < k && !subFile2.atEnd() ) {
       // fprintf(mainFile,"%d ",a2);
        mainFile.write(QString::number(a2).toUtf8());
        mainFile.write("\n");
        //fscanf(subFile2,"%d",&a2);
        QString str = subFile2.readLine();
        a2 = str.toInt();
        j++;
      }
    }
    //while ( !feof(subFile1) ) {
    while (!subFile1.atEnd()) {
     // fprintf(mainFile,"%d ",a1);
      mainFile.write(QString::number(a1).toUtf8());
      mainFile.write("\n");
      //fscanf(subFile1,"%d",&a1);
      QString str = subFile1.readLine();
      a1 = str.toInt();
    }
    //while ( !feof(subFile2) ) {
    while (!subFile2.atEnd()) {
      //fprintf(mainFile,"%d ",a2);
        mainFile.write(QString::number(a2).toUtf8());
        mainFile.write("\n");
      //fscanf(subFile2,"%d",&a2);
        QString str = subFile2.readLine();
        a2 = str.toInt();
    }
    subFile2.close();
    subFile1.close();
    mainFile.close();
    k *= 2;
  }
  //subFile1.remove();
  //subFile2.remove();
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июнь 30, 2015, 13:50 »

Здравствуйте!
Помогите,пожалуйста, решить проблему!
Как приятно читать простые слова "Здравствуйте", "пожалуйста" - только что побывал на др форуме, там это не в ходу, просто вываливается задание (часто фотография)  - и все Улыбающийся Типа "ну может найдется дурачок что за меня сделает". К сожалению, смысл Вашего поста такой же (хотя вежливость многое меняет). Ну елы-палы, почему за Вас кто-то должен отлаживаться? Делаете 2 версии, вставляете печати и сравниваете. Находите в каком месте началось расхождение. Вся эта кропотливая техническая работа - целиком Ваша, беспокоить с ней public форум неприлично. Здесь нечего обсуждать, надо просто делать.

И пользуйтесь тегом для обрамления кода
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #2 : Июнь 30, 2015, 14:02 »

Файл открыли, прочитали данные в пустоту и закрыли. Какой еще результат может быть?
Записан
Bepec
Гость
« Ответ #3 : Июнь 30, 2015, 15:20 »

Непонятно, какие то бессмысленные действия совершаются по всей программе. Как то чтение в пустоту, чтение в локальную переменную и прочее.
Сокращайте программу до необходимого уровня Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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