Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
1

Оставить все как есть || использовать парсер xml || или использовать struct

03.03.2017, 01:08. Просмотров 554. Ответов 4
Метки нет (Все метки)

Собственно имеется код...
Кликните здесь для просмотра всего текста
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
164
165
166
167
168
169
170
171
#include <io.h>
#include <string>
#include <vector>
#include <fstream>
#include <iomanip>
#include <iostream>
 
using namespace std;
 
inline bool Equal(ifstream &f, const char *s)
{
    char *buff = new char[strlen(s) + 1];
    return !(f.get(buff, strlen(s) + 1)&&strcmp(buff,s)&&f.ignore(LLONG_MAX,'\n'));
}
bool FileExists(const char *fname)
{
    _finddata_t data;
    long nFind = _findfirst(fname,&data);
    if (nFind != -1)
    {
         // Если этого не сделать, то произойдет утечка ресурсов
        _findclose(nFind);
        return true;
    }
    cout << "Файл: " << fname << " не найден." << endl;
    return false;
}
void DupKiller(string Name_N)
{    
        cout << "DupKiller[0%]";
        string text;
        vector<string> f1, f2;
        ifstream fin(Name_N);
        while(getline(fin,text)) f1.push_back(text);
        fin.close();
        cout << "\b\b.5%]";
        fin.open("_"+Name_N);
        while(getline(fin,text)) f2.push_back(text);
        fin.close();
 
        cout << "\b\b\b\b\b1.0%]" << setprecision(1) << setiosflags(ios::fixed | ios::showpoint);
        for(vector<string>::iterator iter2(f2.begin()); iter2 != f2.end(); iter2++)
            if(!((*iter2).compare(0,10,"        <German>")&&(*iter2).compare(0,11,"     <Spanish>")&&(*iter2).compare(0,11,"        <Italian>")))
            {
                cout << "\b\b\b\b\b" << .1*(10 + 90*(iter2 - f2.begin()) / (f2.end() - f2.begin())) << "%]";
                f2.erase(iter2--);
            }
 
        cout << "\b\b\b\b\b10.0%]";
        for(vector<string>::iterator iter1(f1.begin()); iter1 != f1.end(); iter1++)
            if(!((*iter1).compare(0,10,"        <German>")&&(*iter1).compare(0,11,"     <Spanish>")&&(*iter1).compare(0,11,"        <Italian>")))
            {
                cout << "\b\b\b\b\b" << 9.9*(iter1 - f1.begin()) / (f1.end() - f1.begin()) << "%]";
                f1.erase(iter1--);
            }
            else
                if(!(*iter1).compare(0,10,"     <French>"))
                {
                    (*iter1).erase(3,6).insert(3,"Russian").erase((*iter1).length()-6,7);
                    (*iter1) += "Russian>";
                }
        cout << " " << setprecision(2) << setiosflags(ios::fixed | ios::showpoint);
 
        for(vector<string>::iterator iter1(f1.begin()); ++iter1 != f1.end(); cout << "\b\b\b\b\b\b\b" << 0.01*(2000 + 8000*(iter1 - f1.begin()) / (f1.end() - f1.begin())) << "%]")
            for(vector<string>::iterator iter2(f2.begin()); ++iter2 != f2.end();)
                if(!(*iter1).compare(*iter2))
                {
                    f1.erase(iter1--);
                    f2.erase(iter2--);
                    break;
                }
 
        ofstream fout(Name_N);
        for (vector<string>::iterator iter1(f1.begin()); iter1 != f1.end(); iter1++) fout << *iter1 << endl;
        fout.close();
        fout.open("_"+Name_N);
        for (vector<string>::iterator iter2(f2.begin()); iter2 != f2.end(); iter2++) fout << *iter2 << endl;
        fout.close();
        cout << "\b\b\b\b\b\b\b100%]  \n\n";
}
 
void main()
{
    setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы
    static const size_t Capacity = 8;
    static const string Name[Capacity] = { "CIV4GameText_Colonization.xml", "CIV4GameText_Colonization_DiplomacyText.xml",
        "CIV4GameText_Colonization_Events.xml", "CIV4GameText_Colonization_Objects.xml", "CIV4GameText_Colonization_Pedia.xml",
        "CIV4GameText_Colonization_Strategy.xml", "CIV4GameTextInfos_Objects_Original.xml", "CIV4GameTextInfos_Original.xml"};
    
    for(int N(0); N != Capacity; N++)
    {
        ifstream feng(Name[N]), frus("_"+Name[N]);
        if(!(FileExists(Name[N].c_str())&&FileExists(("_"+Name[N]).c_str())))
        {
            feng.close();
            frus.close();
            continue;
        }
 
        vector<string> file;
        string text;
        while(getline(feng,text)) file.push_back(text);
        feng.close();
 
        bool b(true);
        int i(0), j(0), k(0), l(0), err_rus(0), err_eng(0);
        char buff;
        
        while (!frus.eof())
            if(Equal(frus,"     <Russian>"))
            {
                string rus(""), eng("");
                getline(frus,rus,'<');
                if(Equal(frus,"     </Russian"))
                    err_rus++; //   cout << "Ошибка считывания RUS строки: " << rus << endl;
                
                if(!Equal(frus,"        <English>")) cout << "NOT while"; // нужно использовать: while (!frus.eof()) {код ниже}
                getline(frus,eng,'<');
 
/*              while (!frus.eof())
                    if(Equal(frus,"     <English>"))
                    {
                        getline(frus,eng,'<');
                        break;
                    }
                    */
                if(Equal(frus,"     </English")) err_eng++; //  cout << "Ошибка считывания ENG строки: " << eng << endl;
                if((rus == "") || (eng == "")) cout << "Error:" << rus << "||" << eng << endl;
//                  if(eng == "Players may lead any Nation with any Leader.")
//                      cout << eng << endl;
 
                int iter(-1);
                string Search ="        <English>"+eng+"</English>";
                while(++iter != file.size())
                {
                    for (; file[iter].find(Search) != string::npos; iter++)
                    {
                        if((file[++iter].find("     <French>") != string::npos)&&(file[iter].find("         <Text>") == string::npos))
                        {
                            file[iter] = "      <French>" + rus + "</French>";
                            i++;
                        }
                        if((file[iter].find("       <French>") != string::npos)&&(file[iter+1].find("           <Text>") != string::npos))
                        {
                            file[iter+1] = "            <Text>" + rus + "</Text>";
                            j++;
                        }
                        if((file[iter].find("       <French>") == string::npos)) 
                            k++;
                        goto Stop;
                    }
                        if(iter == file.size()-1)
                        l++;
                }
                Stop:;  
            }
 
        ofstream fout(Name[N]);
        int iter(-1);
            while(++iter != file.size())
                fout << file[iter] << endl;
        fout.close();
 
        cout << Name[N]  << endl << "Ошибка считывания " << err_rus << " RUS строк и " << err_eng << " ENG строк;\nПереведено: " << i << " French строк и " << j << " Text строк;\nНепереведено: " << k << " Unknown;\nНенайдено: " << l << " строк;\nФайл переведен.\n";
 
        DupKiller(Name[N]); // для отладки 
    }
 
    cout << "THE END";
    cin.get();
}


MrGluck, писал:
Цитата Сообщение от MrGluck Посмотреть сообщение
Если программа должна быть не одноразовая (хотите запускать не один раз), то, как я уже писал в другой теме - парсите xml с помощью специальных библиотек.
Тогда работать будет моментально. А поиск подстроки в строке - достаточно трудоёмкая задача. Да и полагаться на пробелы/символы табуляции - Но если нужно по быстрому получить результат "на коленке" - пойдёт.
Насколько это разумно? [как по мне это только усложнит код и его выполнение]

Добавлено через 1 гектосекунду
А сейчас немного покумекав мозгами...
вообще посчитал что можно использовать struct
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2017, 01:08
Ответы с готовыми решениями:

Как в VC++2008 использовать Framewok 2.0 или не использовать вообще??
интересует консольное приложение - по умолчанию .Net3.5, и поменять нельзя, бо соответствующий ...

Как использовать #undef или вообще не использовать
Посоветуйте какую лучше применить концепцию. Хочу сделать в проекте унифицированные сообщения об...

Как использовать Raycast() в 2d? Или есть raucast2d?
Есть ли какой-нибудь Raycast2D(), просто обычный рейкаст не воспринимает Box колайдеры 2D. Если...

Как правильно использовать struct?
Написал небольшую, глупенькую программку, но столкнулся с проблемой заполнения структуры. Если...

4
2885 / 1966 / 335
Регистрация: 24.11.2012
Сообщений: 4,773
03.03.2017, 08:39 2
Код разбора — жесть, даже для одноразового приложения. Взять нормальный парсер.
0
++Ͻ
16576 / 9614 / 1857
Регистрация: 27.09.2012
Сообщений: 23,843
Записей в блоге: 2
03.03.2017, 09:13 3
Возьмите, например, libxml++ и без шаманства разберите файл.
0
330 / 282 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
03.03.2017, 11:15 4
Конечно парсер бери, проще и удобнее будет. А как ты с помощью структур решил парсить файл?
0
Форумчанин
Эксперт CЭксперт С++
8154 / 5004 / 1436
Регистрация: 29.11.2010
Сообщений: 13,460
03.03.2017, 11:25 5
Коль уж речь пошла о выборе библиотек - порекомендую ещё раз pugixml. Подключается как хедер (не требует линковки), работает шустро, поддерживает for-each циклы, xpath, opensource-ный, MIT лицензия, по синтаксису достаточно прост, имеет хорошую доку + отечественная разработка
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2017, 11:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как использовать struct.pack()?
Повторяю пример из книги Лутца &gt;&gt;&gt; F = open(‘data.bin’, ‘wb’) # Открыть файл для записи в...

Как использовать в ASP те функции, которые есть у MS SQL 7.0 или 2000?
Skajite plz! Kak ispolzovat' v ASP te funktsii, kotorie est' u MS SQL 7.0 ili 2000. Naprimer...

Собираюсь брать комплектующие, стоит что-то заменить на более рентабельное или оставить все как есть ?
Процессор AMD Ryzen 7 1800X (AM4, L3 16384), OEM AM4; Summit Ridge; ядер 8; 14 нм; 3600 МГц; L1 96...

Как использовать собственный класс в структуре struct до определения самого класса в тексте программы
Проблема такая: хочу в структуре одним из элементов сделать класс. Проблема в том, что эта...


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

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

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