Форум программистов, компьютерный форум CyberForum.ru

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

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

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

24.07.2013, 20:35. Просмотров 1433. Ответов 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;
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
24.07.2013, 20:58     Вывод контейнера типа set <string> в файл #2
C++
1
2
ofstream outputfile(argv[argc]);
copy(resultlist.begin(), resultlist.end(), std::ostream_iterator<string>(outputfile, "\n"));
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 21:56     Вывод контейнера типа set <string> в файл #3
Цитата Сообщение от gray_fox Посмотреть сообщение
argv[argc]
Выход за границу массива.
gray_fox
24.07.2013, 22:07
  #4

Не по теме:

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

alsav22
24.07.2013, 22:35
  #5

Не по теме:

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

tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
25.07.2013, 05:17  [ТС]     Вывод контейнера типа set <string> в файл #6
Цитата Сообщение от gray_fox Посмотреть сообщение
C++
1
2
ofstream outputfile(argv[argc]);
copy(resultlist.begin(), resultlist.end(), std::ostream_iterator<string>(outputfile, "\n"));
Чем это отличается от моего варианта? Что в copy анонимный объект и всё. Выход за границу я исправил, но ничего не изменилось.
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
25.07.2013, 05:27  [ТС]     Вывод контейнера типа set <string> в файл #7
Если кто-то думает, что у меня что-то не так с файлами:
Миниатюры
Вывод контейнера типа set <string> в файл  
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.07.2013, 14:42     Вывод контейнера типа set <string> в файл #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"
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
25.07.2013, 14:54  [ТС]     Вывод контейнера типа set <string> в файл #9
Цитата Сообщение от gray_fox Посмотреть сообщение
Возможно у вас просто нет прав на запись этого файла...
И впрямь не открывается, это очень странно - предыдущие программы спокойно работали с этими же файлами.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.07.2013, 14:56     Вывод контейнера типа set <string> в файл #10
tramp_1-3, наверняка дело в \ в пути к файлу.
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
25.07.2013, 15:08  [ТС]     Вывод контейнера типа set <string> в файл #11
Цитата Сообщение от gray_fox Посмотреть сообщение
tramp_1-3, наверняка дело в \ в пути к файлу.
Точно, еще убрал при открытии файла | std :: ios_base :: app и всё супер, но возник вопрос:
-Почему именно /, тогда как в винде используется \ и входные файлы спокойно открываются с \?
Спасибо Вам огромное.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.07.2013, 15:10     Вывод контейнера типа set <string> в файл #12
tramp_1-3, можно и \, только его экранировать надо (т.к. спецсимвол для экранирования lol), т.е. можно так
E:\\out.txt
Вот только зачем это, если есть /?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 15:17     Вывод контейнера типа set <string> в файл
Еще ссылки по теме:

Свой компаратор для контейнера set C++
C++ Использование контейнера set для создания словаря
Считать из файла 2 строки с числами в 2 контейнера set C++
C++ Считать текст из файла в строку типа std::string (файловый ввод/вывод)
C++ Объединить два контейнера set

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

Или воспользуйтесь поиском по форуму:
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
25.07.2013, 15:17  [ТС]     Вывод контейнера типа set <string> в файл #13
Цитата Сообщение от gray_fox Посмотреть сообщение
Вот только зачем это, если есть /?)
Я немного общался с Линуксом, думал, / там принято, а \ в винде, ибо в проводнике в путях к файлам именно \ отображается.
Yandex
Объявления
25.07.2013, 15:17     Вывод контейнера типа set <string> в файл
Ответ Создать тему
Опции темы

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