|
|
|
| Здравствуйте!
Мне надо отсортировать текстовый файл в котором слова расположены так:
# слива = гадость
# ром =очень вк
# пиво = вкусноё
# абрикос = фыва
Сортировать надо по ключевым словам слева, конечно их может быть и 100 и1000. И таких файлов м/б допустим 3.
Вот как это делается на с++?? Вообще не знаю.
Может поможете? | |
|
|
|
|
|
|
|
для: reser
(14.04.2012 в 15:41)
| | 1) Если не сложно, приведите на примере, указанном выше, что должно получить в конце концов?
2) C++ это очень объемный язык, особенно, если использовать библиотеки (пусть даже стандартные), что можно задействовать для решения задачи, например, можно ли использовать STL? | |
|
|
|
|
|
|
|
для: cheops
(14.04.2012 в 17:21)
| | 1)Надо отсортировать по алфавитному порядку, по ключевым словам и в порядке убывания, то есть:
# абрикос = фыва
# пиво = вкусноё
# ром =очень вк
# слива = гадость
Итог надо также записать в текстовый файл.
2) по идее сказал препод писать в visual studio потом надо будет паралелить т.е будут например 4 файла 4 проца и на каждый файл по процу а потом результ в один файл(ну это я уже сам попробую, все таки я это делал уже) | |
|
|
|
|
|
|
|
для: reser
(14.04.2012 в 17:28)
| | Значит придется обходиться без STL она на уровне кода плохо параллелится. Можно делать какие-то предложения относительно длины строки? Т.е. допустим предположить, что длина строки не превышает 80 или 1024 символов или не стоит?
Файл, кстати, в какой кодировке будет? В Windows-1251? | |
|
|
|
|
|
|
|
для: cheops
(14.04.2012 в 19:12)
| | длина строки 100% не превысит 1000 но препод может проверить и свой файл где структура может быть такой:
#
арбуз = ягода лялялялял
пампампам лялляляляля
ля ля
#
молоко = коровий продукт ллялялялялялял
ялялялял лялялялл я ляляля ля л
# | |
|
|
|
|
|
|
|
для: reser
(14.04.2012 в 19:34)
| | Т.е. это и к одной строке нельзя привязываться? Нужно разбивать строку строго по #? Объем файла велик, можно попробовать его прочитать полностью в память или лучше не отходить от построчного чтения? | |
|
|
|
|
|
|
|
для: 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;
} | Однако, вам, как выяснилось, этот вариант не подойдет, так как у вас позиции могут быть многострочными. | |
|
|
|
|
|
|
|
для: cheops
(14.04.2012 в 19:48)
| | ох не знаю пока. компилятора под рукой нету. а у вас работало?
Пусть будет в 1 строку это ему не важно))
Мне бы главно понять как сделать #___= переменной чтоб сравнивать. Понимаю что это подстрока, но как там вхождение как то надо описать? или еще как | |
|
|
|
|
|
|
|
для: 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 файла и соединяет их. Далее сортирует и это окончательный файл сортированный по алфавиту. | |
|
|
|