Форум: Форум C++Разное
Новые темы: 00
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сортировка слов в файле
 
 автор: reser   (14.04.2012 в 15:41)   письмо автору
 
 

Здравствуйте!
Мне надо отсортировать текстовый файл в котором слова расположены так:
# слива = гадость
# ром =очень вк
# пиво = вкусноё
# абрикос = фыва

Сортировать надо по ключевым словам слева, конечно их может быть и 100 и1000. И таких файлов м/б допустим 3.
Вот как это делается на с++?? Вообще не знаю.
Может поможете?

  Ответить  
 
 автор: cheops   (14.04.2012 в 17:21)   письмо автору
 
   для: reser   (14.04.2012 в 15:41)
 

1) Если не сложно, приведите на примере, указанном выше, что должно получить в конце концов?
2) C++ это очень объемный язык, особенно, если использовать библиотеки (пусть даже стандартные), что можно задействовать для решения задачи, например, можно ли использовать STL?

  Ответить  
 
 автор: reser   (14.04.2012 в 17:28)   письмо автору
 
   для: cheops   (14.04.2012 в 17:21)
 

1)Надо отсортировать по алфавитному порядку, по ключевым словам и в порядке убывания, то есть:

# абрикос = фыва
# пиво = вкусноё
# ром =очень вк
# слива = гадость

Итог надо также записать в текстовый файл.

2) по идее сказал препод писать в visual studio потом надо будет паралелить т.е будут например 4 файла 4 проца и на каждый файл по процу а потом результ в один файл(ну это я уже сам попробую, все таки я это делал уже)

  Ответить  
 
 автор: cheops   (14.04.2012 в 19:12)   письмо автору
 
   для: reser   (14.04.2012 в 17:28)
 

Значит придется обходиться без STL она на уровне кода плохо параллелится. Можно делать какие-то предложения относительно длины строки? Т.е. допустим предположить, что длина строки не превышает 80 или 1024 символов или не стоит?

Файл, кстати, в какой кодировке будет? В Windows-1251?

  Ответить  
 
 автор: reser   (14.04.2012 в 19:34)   письмо автору
 
   для: cheops   (14.04.2012 в 19:12)
 

длина строки 100% не превысит 1000 но препод может проверить и свой файл где структура может быть такой:
#
арбуз = ягода лялялялял
пампампам лялляляляля
ля ля
#
молоко = коровий продукт ллялялялялялял
ялялялял лялялялл я ляляля ля л
#

  Ответить  
 
 автор: cheops   (14.04.2012 в 19:46)   письмо автору
 
   для: reser   (14.04.2012 в 19:34)
 

Т.е. это и к одной строке нельзя привязываться? Нужно разбивать строку строго по #? Объем файла велик, можно попробовать его прочитать полностью в память или лучше не отходить от построчного чтения?

  Ответить  
 
 автор: cheops   (14.04.2012 в 19:48)   письмо автору
 
   для: reser   (14.04.2012 в 17:28)
 

Не уверен, что смогу вам до конца помочь, вот вариант построчного чтения с целью создания двумерного массива в памяти
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
  FILE * pFile = NULL;
  int n = 0;
  char buffer[80];
  char **contents;

  // Открываем файл
  pFile = fopen ("D:\\crypt.txt""r");
  if (!pFile != NULL)
  {
    cout << "Ошибка открытия файла" << endl;
    return 0;
  }
  // Подсчитываем количество строк в файле
  while (fgets (buffer, 80, pFile)) n++;
  // Резервируем память под содержимое файла
  contents = new char *[n];
  for(int i = 0; i < n; i++)
  {
    contents[i] = new char[80];
  }
  // Устанавливаем файловый укзатель в начало
  fseek(pFile, 0, SEEK_SET);
  for(int i = 0; i < n; i++)
  {
    fgets(contents[i], 80, pFile);
  }
  // Закрываем файл
  fclose (pFile);
  // Освобождаем паять
  for(int i = 0; i < n; i++)
  {
    delete [] contents[i];
  }
  delete [] contents;
  system("PAUSE");
  return 0;
}
Однако, вам, как выяснилось, этот вариант не подойдет, так как у вас позиции могут быть многострочными.

  Ответить  
 
 автор: reser   (14.04.2012 в 19:58)   письмо автору
 
   для: cheops   (14.04.2012 в 19:48)
 

ох не знаю пока. компилятора под рукой нету. а у вас работало?


Пусть будет в 1 строку это ему не важно))

Мне бы главно понять как сделать #___= переменной чтоб сравнивать. Понимаю что это подстрока, но как там вхождение как то надо описать? или еще как

  Ответить  
 
 автор: reser   (15.04.2012 в 12:51)   письмо автору
 
   для: cheops   (14.04.2012 в 19:48)
 

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

Я так понимаю надо тупо не учитывать # (наверно начинать считывать с +1 элем строки) и сортировать по самому слову и будет сортироваться вся строка. Здесь вводят строки а просто надо сделать с файла чтение. вот и думаю пока как это сделать все. если что помогите что-ли. хотя неплохо бы считать # началом новой записи по которой сортируют это тоже не ясно как сделать...
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define N 100
#define M 30
int main(int argc, char* argv[]) {
char a[N][M];
int n, i;
scanf("%d", &n);
for (i=0; i<n; i++)
scanf("%s", &a[i]);
qsort(a, n, sizeof(char[M]), (int (*)(const void *,const void *)) strcmp);
for (i=0; i<n; i++)
printf("%s\n", a[i]);
return 0;
}

вот с этим крокодилом надо что то сделать подогнать к нам так сказать qsort(a, n, sizeof(char[M]), (int (*)(const void *,const void *)) strcmp); этот strcmp сам должен сортировать))

Хотя вот вариант!

// pim2.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <algorithm>
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <string>

int main()
{
std::string s;
std::vector<std::string> lines;

// читаем файл в контейнер построчно
std::ifstream in_file("laba3.txt", std::ios::in);
while(getline(in_file, s))
lines.push_back(s);
in_file.close();

std::sort(lines.begin(), lines.end()); // сортируем контейнер

// и записываем отсортированный контейнер в новый файл
std::vector<std::string>::iterator i = lines.begin();
std::ofstream out_file("laba31.txt", std::ios::out);
for(; i != lines.end(); ++i)
out_file << *i << std::endl;
out_file.close();
return 0;
}
Тут теперь надо сделать так чтобы можно было выбирать несколько текстовых файлов.
То есть файлы должны лежать просто в папке и их должно быть четное количество например 4.
Программа сама их открывает и сортирует.
Потом соединяет по 2 файла в один и получается 2 новых файла.
Сортирует их.
Получает 2 файла и соединяет их. Далее сортирует и это окончательный файл сортированный по алфавиту.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования