Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
#1

Вывод контейнера типа set <string> в файл - C++

24.07.2013, 20:35. Просмотров 1623. Ответов 12
Метки нет (Все метки)

Конечный файл пустует, я всяко-разно пытался, вот мой вариант с итераторами. Смотрите закоментированный код - всё остальное полностью рабочее, кроме вывода в файл.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
#include <set>
#include <fstream>
#include <cstdlib>
#include <vector>
 
using std :: vector;
using std :: set;
using std :: cout;
using std :: cin;
using std :: string;
using std :: cerr;
using std :: ifstream;
using std :: ofstream;
 
void  NumberOfLines (int argc, char * argv [], int entries []);
 
int main (int argc, char * argv []) {
    if (argc == 1) {
        cerr << "Usage: files for input, last for output\n";
        exit (1);
    };
    int quantity = argc - 2;         //êîëè÷åñòâî ГґГ*éëîâ
    int * entries = new int [quantity];   //Г¬Г*Г±Г±ГЁГў, Гў êîòîðîì õðГ*Г*ГЁГІГ±Гї êîëè÷åñòâî Г§Г*ГЇГЁГ±ГҐГ© (ñòðîê) Гў ГЄГ*æäîì ГґГ*éëå
    NumberOfLines (argc, argv, entries);  //ГґГіГ*êöèÿ ïîäñ÷¸òГ* êîëè÷åñòâГ* Г§Г*ГЇГЁГ±ГҐГ©
    char ch;
    std :: ostream_iterator <string>  show (cout, "\n");
    vector <set <string> > lists;    //ГЄГ®Г*ГҐГ·Г*ûé Г¬Г*Г±Г±ГЁГў Г§Г*ГЇГЁГ±ГҐГ©
    int emptylists = 0; //êîëè÷åñòâî ïóñòûõ ГґГ*éëîâ, ÷òîáû ïðè âûâîäå lists [i] Г*ГҐ âîçГ*ГЁГЄГ*ëî îøèáîê
    ifstream inputfile;
    for (int i = 0; i < quantity; i++) {        //ïðî÷èòГ*ГІГј ГўГ±ГҐ ГґГ*éëû, êðîìå ïåðâîãî ГЁ ïîñëåäГ*ГҐГЈГ®
        if (entries [i] != 1) {
            inputfile.open (argv [i + 1]);                     //Гі âõîäГ*îãî argv [i + 1] ГґГ*éëГ* entries[i] ñòðîê
            set <string> tempset;                   //âðåìåГ*Г*ûé ñïèîê äëÿ õðГ*Г*ГҐГ*ГЁГї ГІГҐГЄГіГ№ГҐГЈГ® îáðГ*ГЎГ*òûâГ*åìîãî ГґГ*éëГ*
            for (int j = 0; j < entries[i]; j++) {  // ïðî÷èòГ*ГІГј ГўГ±ГҐ ñòðîêè argv [i + 1] ГґГ*éëГ*                   
                string tempstr;                     //âðåìåГ*Г*Г*Гї ñòðîêГ* äëÿ õðГ*Г*ГҐГ*ГЁГї ГІГҐГЄГіГ№ГҐГ© îáðГ*ГЎГ*òûâГ*åìîé ñòðîêè
                while (inputfile.get (ch) && ch != '\n') {
                    tempstr += ch;
                };
                tempset.insert (tempstr);
            };
            lists.push_back (tempset);
            cout << "\"" << argv [i+1] <<"\" list:\n";
            copy (lists [i - emptylists].begin (), lists [i - emptylists].end (), show);
            cout << "\n";
            inputfile.clear ();
            inputfile.close ();
        }
        else  {
            emptylists++;
            cout << "\"" << argv [i+1] <<"\" list is empty.\n\n";
            continue;
        };
    };
    cout << "Result:\n";
    int v = 0;
    set <string> resultlist;
    vector <set <string> > :: iterator viter;
    for ( viter = lists.begin (); viter != lists.end (); viter++, v++)
        merge (lists [v].begin (), lists [v].end (), resultlist.begin (), resultlist.end (), std :: inserter (resultlist, resultlist.begin ()));
    copy (resultlist.begin (), resultlist.end (), show);
    cout << "\n";
    ofstream outputfile;
    outputfile.open (argv [argc], std :: ios_base :: trunc | std :: ios_base :: app);
    /*std :: ostream_iterator <string> output (outputfile, "\n");
    copy (resultlist.begin (), resultlist.end (), output);
    */
    /*set <string> :: iterator  siter;
    for (siter = resultlist.begin (); siter != resultlist.end (); siter++)
        outputfile << *siter << "\n";
    */
    system ("pause");
    return 0;
};
 
void  NumberOfLines (int argc, char * argv [], int entries []) {
    int quantity = argc - 2;
    for (int i = 0; i < quantity; i++)
        (entries [i]) = 1;
    ifstream inputfile;
    for (int i = 0; i < quantity; i++) {    //ïîäñ÷¸ò êîëè÷åñòâГ* Г§Г*ГЇГЁГ±ГҐГ© Гў ГЄГ*æäîì ГґГ*éëå
        inputfile.open (argv [i + 1]);
        char ch;
        while (inputfile.get (ch))
            if ( ch == '\n')
                (entries [i])++;
        if (ch == '\n')     //åñëè Гў ГЄГ®Г*öå ГґГ*éëГ* ïðîñòî ГЇГіГ±ГІГ*Гї ñòðîêГ*, óìåГ*ГјГёГЁГІГј êîëè÷åñòâî ñòðîê
            (entries [i])--;
        inputfile.clear ();
        inputfile.close ();
    };
    return;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2013, 20:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод контейнера типа set <string> в файл (C++):

Итератор контейнера set - C++
Здравствуйте! Каким образом можно изменить значение итератора set на n (кроме вызова ++ n раз). Можно ли преобразовать итератор одного типа...

Передача контейнера set в функцию - C++
Всем здравствуйте! Мне нужно написать функцию которая будет выводить всю информацию которая хранится в контейнере set. Пробовал передавать...

Объединить два контейнера set - C++
У меня есть два сета, их надо как то обьеденить в один сет. Как это сделать? Вот мой код, он выдает ошибку - ругается на поле с merge. ...

Сравнить два контейнера set - C++
Всем добрый вечер . Как сравнить два контейнера set? Допустим: set &lt;int&gt; m1; set &lt;int&gt; m2; for( int i = 0; i &lt; 5;...

Свой компаратор для контейнера set - C++
Здравствуйте! Код следующий (комменты): #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;set&gt; using namespace std; //...

Вывод вектора типа vector<string> - C++
Имеется следующий код, который разделяет строку на отдельные слова и помещает их в вектор, возникла проблема с выводом вектора, подскажите...

12
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.07.2013, 20:58 #2
C++
1
2
ofstream outputfile(argv[argc]);
copy(resultlist.begin(), resultlist.end(), std::ostream_iterator<string>(outputfile, "\n"));
2
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 21:56 #3
Цитата Сообщение от gray_fox Посмотреть сообщение
argv[argc]
Выход за границу массива.
2
gray_fox
24.07.2013, 22:07
  #4

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Выход за границу массива.
кривой копипаст)

1
alsav22
24.07.2013, 22:35
  #5

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
кривой копипаст)
Я для ТС и написал.

1
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
25.07.2013, 05:17  [ТС] #6
Цитата Сообщение от gray_fox Посмотреть сообщение
C++
1
2
ofstream outputfile(argv[argc]);
copy(resultlist.begin(), resultlist.end(), std::ostream_iterator<string>(outputfile, "\n"));
Чем это отличается от моего варианта? Что в copy анонимный объект и всё. Выход за границу я исправил, но ничего не изменилось.
0
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
25.07.2013, 05:27  [ТС] #7
Если кто-то думает, что у меня что-то не так с файлами:
0
Миниатюры
Вывод контейнера типа set <string> в файл  
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.07.2013, 14:42 #8
tramp_1-3, а файл открывается вообще?
C++
1
2
3
4
5
6
ofstream outputfile(argv[argc - 1]);
if (!outputfile) {
   std::cerr << "Can't open file '" << argv[argc - 1] << "'" << std::endl;
   return EXIT_FAILURE;
}
copy(/*...*/);
Возможно у вас просто нет прав на запись этого файла...

Добавлено через 2 минуты
"E:\out.txt"
Используй прямой слэш:
"E:/out.txt"
1
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
25.07.2013, 14:54  [ТС] #9
Цитата Сообщение от gray_fox Посмотреть сообщение
Возможно у вас просто нет прав на запись этого файла...
И впрямь не открывается, это очень странно - предыдущие программы спокойно работали с этими же файлами.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.07.2013, 14:56 #10
tramp_1-3, наверняка дело в \ в пути к файлу.
1
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
25.07.2013, 15:08  [ТС] #11
Цитата Сообщение от gray_fox Посмотреть сообщение
tramp_1-3, наверняка дело в \ в пути к файлу.
Точно, еще убрал при открытии файла | std :: ios_base :: app и всё супер, но возник вопрос:
-Почему именно /, тогда как в винде используется \ и входные файлы спокойно открываются с \?
Спасибо Вам огромное.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.07.2013, 15:10 #12
tramp_1-3, можно и \, только его экранировать надо (т.к. спецсимвол для экранирования lol), т.е. можно так
E:\\out.txt
Вот только зачем это, если есть /?)
1
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
25.07.2013, 15:17  [ТС] #13
Цитата Сообщение от gray_fox Посмотреть сообщение
Вот только зачем это, если есть /?)
Я немного общался с Линуксом, думал, / там принято, а \ в винде, ибо в проводнике в путях к файлам именно \ отображается.
0
25.07.2013, 15:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 15:17
Привет! Вот еще темы с ответами:

Шаблон как тип контейнера std::set - C++
template&lt;class T&gt; int func(T&amp;, int); typedef std::ostream_iterator&lt;int&gt; out_in; int main() { int xx{1, 2, 3, 4, 5, 6, 7, 7,...

Использование контейнера set для создания словаря - C++
Всем привет. Прошу помощи с программой. Само задание: Написать программу «Англо - русский и русско - английский словарь». «База данных»...

Как достать указатель на объект из контейнера set - C++
Имеется вот такой код #include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;set&gt; #include...

Считать из файла 2 строки с числами в 2 контейнера set - C++
Здравствуйте! Помогите, как считать из файла последовательно 2 строки с числами? Например файл такой: 56 78 4 2 2 33 1 45 Нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru