Nano Hash - криптовалюты, майнинг, программирование

Объединение двух отсортированных текстовых файлов

Мне нужно объединить два текстовых файла и отсортировать их по «фамилии» в третьем выходном файле. Мой код ниже, он выводит тарабарщину, все в одной строке. Я понимаю, что моя перегрузка может быть глупой, любая помощь приветствуется.

//header
#include <fstream>
#include <string>
#include <iostream> 
using namespace std;

struct mergedList {
  string firstName;
  string lastName;
  float gpa;
  int hours;
};

ostream& operator << (ostream& os, mergedList A) {
  os << A.firstName << "\t" << A.lastName << "\t" << A.gpa << "\t" << A.hours;
  return os;
}
istream& operator >> (istream& is, mergedList& A) {
  is >> A.firstName >> A.lastName >> A.gpa >> A.hours;
  return is;
}

void swap(mergedList D1[], int i, int j);
void sort(mergedList D1[], int size);

int main() {
  ifstream indata;
  ifstream indata2;
  ofstream outdata;
  indata.open("merge1.txt");
  indata2.open("merge2.txt");
  outdata.open("merged.txt");
  //begin sentinel controlled loop for both lists
  mergedList D1[100];
  int index = 0;
  indata >> D1[index];
  while (!indata.eof()) {
    index++;
    indata >> D1[index];
  }
  sort(D1, index);
  mergedList D2[100];
  int index2 = 0;
  indata2 >> D2[index2];
  while (!indata2.eof()) {
    index2++;
    indata2 >> D2[index2];
  }
  sort(D2, index); {
    int i = 0, j = 0;
    while ((i < index) && (j < index2)) if (D1[i].lastName < D2[j].lastName) {
        outdata << D1[i];
        i++;
        indata >> D1[i];
      } else {
        outdata << D2[j];
        j++;
        indata2 >> D2[j];
      }
  }
  indata.close();
  indata2.close();
  outdata.close();
  return 0;
}

void swap(mergedList D1[], int i, int j) {
  mergedList temp;
  temp = D1[i];
  D1[i] = D1[j];
  D1[j] = temp;
  return;
}

void sort(mergedList D1[], int size) {
  for (int p = 1; p < size; p++) {
    for (int c = 0; c < size - p; c++) {
      if (D1[c].lastName > D1[c + 1].lastName) swap(D1, c, c + 1);
    }
  }
  return;
}
13.04.2013

  • Один вопрос, почему вы сортируете входные данные из двух файлов отдельно? Вы можете прочитать их в один массив (предпочтительно вектор) и отсортировать все это. 14.04.2013
  • Не пытайтесь перегружать стандартные методы! Люди могут прочитать ваш код и запутаться! 14.04.2013

Ответы:


1

Вот некоторый код. Я попытался объяснить как можно больше. Если вы используете C++, вы должны попытаться использовать преимущества контейнеров и алгоритмов, которые уже доступны для вас.

struct mergedList
{
    string firstName;
    string lastName;
    float gpa;
    int hours;
};



ostream& operator <<(ostream& os, mergedList A)
{
    os << A.firstName << "\t" << A.lastName << "\t" << A.gpa << "\t" << A.hours;
    return os;
}


istream& operator >>(istream& is, mergedList& A)
{
    is >> A.firstName >> A.lastName >> A.gpa >> A.hours;
    return is;
}

// We use this to compare two MergedList structs. i.e. by first name
// http://www.cplusplus.com/reference/algorithm/sort/ for an example
struct my_sorter {
  bool operator() (mergedList one, mergedList two) { return one.firstName < two.firstName ; }
};



int main()
{
    ifstream indata;
    ifstream indata2;
    ofstream outdata;

    indata.open("merged.txt");
    indata2.open("merged2.txt");
    outdata.open("merged.txt");

    // This can be a vector. No need for array here.
    vector<mergedList> D1;
    int index=0, index2 = 0;

    mergedList tmp;

    // You can read from streams like this if the data is formatted.
    while (indata >> tmp)
    {
        D1.push_back(tmp);
        index++;            // Maybe you need this??
    }

    // Read the second file in to the same vector.
    // You don't need another one.
    while (indata2 >> tmp)
    {
        D1.push_back(tmp);
        index2++;
    }

    cout << "Before sorting" << endl;
    copy(D1.begin(), D1.end(), ostream_iterator<mergedList>(cout, "\n"));

    // Sort the vector using the std::sort algorithm.
    // http://www.cplusplus.com/reference/algorithm/sort/ for an example
    sort(D1.begin(), D1.end(), my_sorter());

    cout << "After sorting" << endl;
    copy(D1.begin(), D1.end(), ostream_iterator<mergedList>(cout, "\n"));

    // Write the sorted list to the output file
    copy(D1.begin(), D1.end(), ostream_iterator<mergedList>(outdata, "\n"));

    indata.close();
    indata2.close();
    outdata.close();

    return 0;
}
13.04.2013
  • Я никогда раньше не использовал векторы, и я читал о них все это время. Меня смущает ostream_iterator, где у вас есть After sorting. Все они говорят, что это не определено. В шапку добавил вектор и алгоритм. Извините, я просто не знаю, как это исправить 14.04.2013
  • @ JAY3 о, тебе нужно #include<iterator> для этого. Кстати, это просто причудливый способ печати. Вместо этого вы можете использовать цикл for и печатать его один за другим, если хотите. 14.04.2013
  • @ JAY3 Я написал часть кода, подобного этому, потому что видел перегрузку и использование вашего ostream и подумал, что вы, вероятно, уже знаете это или можете легко понять это. 14.04.2013
  • Ха, да, я понял, глупая ошибка новичка. Большое спасибо! 14.04.2013

  • 2

    Если для вас важна оптимизация, я предлагаю вам использовать контейнеры STL, поскольку реализованы правильные методы сортировки. Не используйте статические массивы, если ваш код должен работать с каждым входным файлом. Я мог бы также добавить, что вы можете сначала объединить два файла, а затем отсортировать третий.

    13.04.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..