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

Копирование данных из файла в отображение. STL - C++

Восстановить пароль Регистрация
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
20.04.2013, 23:31     Копирование данных из файла в отображение. STL #1
Суть такова. Написал программку. Предполагается, что работает она так: открывает текстовый файл, весь этот файл заливает в строку string, потом осуществляет итерацию по этой строке, посимвольно проверяя её значения. Если символ это апостроф " ' ", то в зависимости от буквы стоящей за ним записывается слово (английские сокращения 've, 'm, 's, 'll, 't) have, am, is, will и not соответственно. Если символ любой кроме апострофа то происходит обычная инкрементация итератора и счетчика.Если итератор указывает на букву или цифру, то запускается соответствующий цикл. Компилятор ни на что не ругается, однако я не могу скомпилировать это. Окно просто открывается и резко закрывается не смотря на system("PAUSE");. Даже если бы цикл был бесконечен, то окно бы не исчезло сразу. Пользую билдер 6. Вот сам код. Кому не лень втыкать в него помогите пожалуйста. Как мог закомментировал. Опытному пользователю должно быть понятно, наверное:

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
//---------------------------------------------------------------------------
 
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <map>
#include <ctype.h>
using namespace std;
//---------------------------------------------------------------------------
map<string, int, greater<string> > fTable; //множество для слов и их количества
//---------------------------------------------------------------------------
bool isExist (const string& s) // функция для проверки наличия строк в контейнере
{
 return (fTable[s] > 0)?true:false;
}
//---------------------------------------------------------------------------
bool itP(string::iterator it)// функция проверяет символ возвращаемый *it
{
 if((*it == ' ' || ispunct(*it) || *it == '\n') && (*(it-3)!=*("'") && *it!=*"'"))
 return true;
 else
 return false;
}
//---------------------------------------------------------------------------
 
 
int main(int argc, char* argv[])
{
 
 map<string,int,greater<string> >::iterator iter;
 string resulty;
 char cFN = *("'");
 int ctr = 0;
 int Tctr = 0;
 
 
 ifstream infile("songtext.dat"); //открываем фаил
 istreambuf_iterator<char> isiter(infile);
 istreambuf_iterator<char> end_of_stream;
 string :: iterator it;
 
 string to_define(isiter,end_of_stream); //заливаем этот фаил в строку
 
 it = to_define.begin(); //используем итератор строки
 while( it != to_define.end())
 {
  if ( *it == cFN)
  /* если возвращаемый символ равен апострофу ' как правило это сокращения, то
  запускаем цикл*/
 
  {
   switch(*(it+1))
   {
        case 'l':
                if(isExist("will"))
                {       fTable["will"] += 1; }
                else
                {       fTable["will"] = 1; }
                it+=3;Tctr+=3;
                break;
        case 'r':
                if(isExist("are"))
                {       fTable["are"] += 1; }
                else
                {       fTable["are"] = 1; }
                it+=3;Tctr+=3;
                break;
        case 'v':
 
                if(isExist("have"))
                {       fTable["have"] +=1;}
                else
                {       fTable["have"] = 1; };
                it+=3;Tctr+=3;
                break;
        case 's':
                if(isExist("is"))
                {       fTable["is"] += 1;}
                else
                {       fTable["is"] = 1; }
                it+=2;Tctr+=2;
                break;
        case 'm':
                if(isExist("am"))
                {       fTable["am"] += 1; }
                else
                {       fTable["am"] = 1; }
                it+=2;Tctr+=2;
                break;
        case 't':
                if(isExist("not"))
                {       fTable["not"] += 1; }
                else
                {       fTable["not"] = 1; }
                it+=2;Tctr+=2;
                break;
   }
 }
 
 if(itP(it))
 /*эта штука работает, наша функция вернула true, то есть если итератор
 указывает не на букву или цифру*/
 {
  it++; ctr++;
 }
 
 if(!itP(it))
 /*в случае если символ буква/цифра*/
{
 
  if(it == to_define.begin()&&Tctr == 0) //если итератор указывает на начало
 {
 
   while(!itP(it))
   { it++;ctr++; }
    /*инкрементируем итератор и счетчик, счетчики организованны таким образом,
     что Tctr всегда будет равен началу слова,которое заливается в resulty
     функцией substr(), а ctr всегда будет равен концу этого слова*/
   resulty = to_define.substr(Tctr,ctr);
  }
  else //если итератор указывает не на начало
  {
  Tctr += ctr;
  while(!itP(it))
        {it++; ctr++;}
  resulty = to_define.substr(Tctr,ctr);
  }
}
 
 if(isExist(resulty))
 //если слово уже есть в отображении то увеличиваем поле на 1
 {
  fTable[resulty] += 1;
 }
 else // если же нет, то поле равно единице
 { fTable[resulty] = 1; }
 it++;Tctr++;
}
 
//выводим что получилось на экран
for(iter = fTable.begin();iter !=fTable.end(); iter++ )
        cout << (*iter).first << ' ' << (*iter).second << ' ';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 system("PAUSE");
 
 
        return 0;
}
//---------------------------------------------------------------------------
Добавлено через 40 минут
пробовал заливать в онлайн компилятор. он выдал "No errors or program output". Не пойму что же тут не так
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2013, 23:31     Копирование данных из файла в отображение. STL
Посмотрите здесь:

C++ Копирование данных из файла в файл
копирование файла C++
C++ Копирование контейнера vector в конструкторе (STL)
STL контейнер stack, содержит пользовательский тип данных C++
Сохранение данных пользовательского типа в list из stl C++
C++ Чтение .stl (stereolithography) файла
C++ Копирование файла C++
STL Вектор Копирование элемнтов себя из себя C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
21.04.2013, 09:21     Копирование данных из файла в отображение. STL #2
fuzzytoozy, то что бросилось в глаза, это смелое ожидание в строчке 47, что итератор когда-нибудь будет равен to_define.end(), учитывая какие вы с ним выкрутасы в теле проделываете. Замените != на <.
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
21.04.2013, 17:36  [ТС]     Копирование данных из файла в отображение. STL #3
даааа. спасибки. теперь всё работаееет:
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <map>
#include <ctype.h>
using namespace std;
//---------------------------------------------------------------------------
map<string, int, less<string> > fTable; 
//---------------------------------------------------------------------------
bool isExist (const string& s) 
{
 return (fTable[s] > 0)?true:false;
}
//---------------------------------------------------------------------------
bool itP(string::iterator it)
{
 if((*it == ' ' || ispunct(*it) || *it == '\n') )
 return true;
 else
 return false;
}
//---------------------------------------------------------------------------
 
 
int main(int argc, char* argv[])
{
 
 map<string,int,less<string> >::iterator iter;
 string resulty;
 string lres;
 char cFN = *("'");
 int ctr = 0;
 int Tctr = 0;
 
 
 ifstream infile("songtext.dat"); 
 istreambuf_iterator<char> isiter(infile);
 istreambuf_iterator<char> end_of_stream;
 string :: iterator it;
 
 string to_define(isiter,end_of_stream); 
 
 it = to_define.begin(); 
 while( it < to_define.end())
 {
  if ( *it == cFN)
 
  {
   switch(*(it+1))
   {
        case 'l':
                if(isExist("will"))
                {       fTable["will"] += 1; }
                else
                {       fTable["will"] = 1; }
                it+=3;Tctr+=3;
                break;
        case 'r':
                if(isExist("are"))
                {       fTable["are"] += 1; }
                else
                {       fTable["are"] = 1; }
                it+=3;Tctr+=3;
                break;
        case 'v':
 
                if(isExist("have"))
                {       fTable["have"] +=1;}
                else
                {       fTable["have"] = 1; };
                it+=3;Tctr+=3;
                break;
        case 's':
                if(isExist("is"))
                {       fTable["is"] += 1;}
                else
                {       fTable["is"] = 1; }
                it+=2;Tctr+=2;
                break;
        case 'm':
                if(isExist("am"))
                {       fTable["am"] += 1; }
                else
                {       fTable["am"] = 1; }
                it+=2;Tctr+=2;
                break;
        case 't':
                if(isExist("not"))
                {       fTable["not"] += 1; }
                else
                {       fTable["not"] = 1; }
                it+=2;Tctr+=2;
                break;
   }
 }
 
 if(itP(it))
 
 {
  it++; ctr++;
 }
 
 if(!itP(it))
 
{
 
  if(it == to_define.begin()&&Tctr == 0)
 {
 
   while(!itP(it))
   { it++;ctr++; }
   resulty = to_define.substr(Tctr,ctr);
   transform(resulty.begin(), resulty.end(),resulty.begin(),tolower);
  }
  else
  {
  Tctr += ctr;
  ctr = 0;
  while(!itP(it))
        {it++; ctr++;}
  resulty = to_define.substr(Tctr,ctr);
  transform(resulty.begin(), resulty.end(),resulty.begin(),tolower);
  }
}
 
 if(resulty == "won"){resulty = "will";}
 
 if(isExist(resulty))
 
 {
  fTable[resulty] += 1;
 }
 else 
 { fTable[resulty] = 1; }
 
 if( *it != cFN )
 {it++;Tctr++;}
 
}
 
 
 
 for(iter = fTable.begin();iter !=fTable.end(); iter++ )
        cout << (*iter).first << ' ' << (*iter).second << endl;;
 
 
   system("PAUSE");
 
 
 
 
 
 
 
 
 
 
 
 
        return 0;
}
//---------------------------------------------------------------------------
Yandex
Объявления
21.04.2013, 17:36     Копирование данных из файла в отображение. STL
Ответ Создать тему
Опции темы

Текущее время: 18:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru