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

Работа с файлами - C++

Восстановить пароль Регистрация
 
Pupsen
Сообщений: n/a
07.07.2012, 16:51     Работа с файлами #1
Надо исправить работу по заданию.

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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
// Для работы с функциями fopen, fgets итд
#include <stdio.h>
// Для работы с функциями _open, _read итд
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
// Для работы с потоками, строками и контейнерами
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <locale>
#include <algorithm>
using namespace std;
 
 
//////////////////////////////////////////////////////////////////////////////
//////////////////// Задание 1 ///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
 
/**
    С помощью функций потокового ввода-вывода языка С (fopen, fread, fscanf…) прочитать файл countryInfo 
    и вывести на экран названия всех стран и их столиц
*/
void task1() {
    // Открытие файла в режиме "только для чтения"
    FILE* sourceFile;
    fopen_s(&sourceFile, "../countryInfo.txt", "r");
 
    char* buff = new char[1024];
    char* tld = new char[50];
    char* countryName = new char[128];
 
    
 
    // считывание строк до тех пор, пока fgets возвращает непустое значение (пока файл не закончится)
    while ( fgets(buff, 1024, sourceFile) != NULL) {
        // пропуск строк, начинающихся с символа #
        if (buff[0] == '#') continue;
        // считывание iso3-кода, названия страны и столицы из строки файла
 
        // Внимание! этот вариант разбора некорректно работает с названиями, содержащими пробелы.
        // sscanf считает разделителями и пробелы, и табуляции
        // sscanf(buff, "%*2s %3s %*d %*s\t%s\t\%s", iso3, countryName, capital);
 
        char * token_ctx = NULL;
        char * token = strtok_s( buff, "\t", &token_ctx);
 
        int n = 0;
        while (token != NULL) {
            switch(n) {
                case 9: strcpy_s(tld,50,token); break;
                case 4: strcpy_s(countryName,128,token); break;
                
            }
            token = strtok_s( NULL, "\t", &token_ctx);
            n++;
        }
        cout << tld << ' ' << countryName << '\t' << endl;
    }
 
    delete tld;
    delete countryName;
    
    delete buff;
 
    // закрытие файла
    fclose(sourceFile);
}
 
//////////////////////////////////////////////////////////////////////////////
//////////////////// Задание 2 ///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/**
* элемент, записываемый в файл - iso3 код страны и позиция в исходном файле
*/
struct index_record {
    string iso3;
    long pos;
    index_record(long _pos, char* _str) {
        pos = _pos;
        iso3 = _str;
    }
};
 
/**
* фукнция считывает индексный файл, сформированный в task2() и выводит в консоль его содержимое
*/
void readIndexFile() {
    ifstream indexFile("index.bin",ios::binary);
 
    int count = 0;
    char buff[4 + sizeof(long)];
    while(indexFile.read(buff,4 + sizeof(long))) {
        index_record rec(*(long*)(buff+4),buff);
        cout << rec.iso3 << " " << rec.pos << endl;
        count++;
    }
    indexFile.close();
    cout << "Index file contains " << count << " countries" << endl;
}
 
/**
    С помощью функций нижнего уровня работы с файлами (_open, _write…) 
    сформировать индексный файл для файла countryInfo. 
    Индексный файл должен содержать ISO3-код страны и смещение от начала исходного файла 
    до начала строки с описанием страны.
*/
void task2() {
    ifstream sourceFile("../countryInfo.txt");
 
    // ВНИМАНИЕ! В сдаваемых работах считывание файла должно использовать функции _read и _tell!!!
    vector<index_record> index;
    char* buff = new char[1024];
    for(long pos = sourceFile.tellg(); sourceFile.getline(buff,1024); pos = sourceFile.tellg()) {
        // пропуск строк, начинающихся с символа #
        if (buff[0] == '#') continue;
        char iso3[4] = {buff[3],buff[4],buff[5],0};
        index.push_back(index_record(pos,iso3));
    }
 
    sourceFile.close();
 
    // Запись файла индекса - открытие, потом в цикле запись сначала строки, потом значения смещения
    // затем закрытие файла
    int fileHandle;
    fileHandle = _open("index.bin", _O_RDWR|_O_TRUNC|_O_CREAT|_O_BINARY, _S_IREAD | _S_IWRITE );
    for (vector<index_record>::iterator b = index.begin(); b != index.end(); b++) {
        index_record rec = *b;
        //cout << rec.iso3 << " " << rec.pos << endl;
        _write(fileHandle,(rec.iso3.c_str()),rec.iso3.length() + 1);
        _write(fileHandle,&(rec.pos),sizeof(long));
    }
    _close(fileHandle);
 
    readIndexFile();
}
 
 
 
//////////////////////////////////////////////////////////////////////////////
//////////////////// Задание 3 ///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
 
/**
* Структура с описанием страны (используется в 3м задании)
*/
struct country {
    wstring title;
    wstring iso2;
    int population;
    wstring geonameid;
    wstring tld;
 
};
bool titleSort(country& a, country& b) {return a.iso2 < b.iso2;}
 
/**
* Функция считывает файл strings.txt в вектор строк.
* Вектор потом используется для вывода названий - в моем примере там только заголовок "Список стран"
*/
vector<wstring> readStrings(locale& locale) {
    vector<wstring> vec;
    wifstream file("strings.txt");
    file.imbue(locale);
    wstring line;
    while(getline(file, line))
        vec.push_back(line);
    file.close();
    return vec;
}
 
/**
    С помощью классов библиотеки iostream сформировать html-файл, 
    содержащий описания 10 стран с самым длинным названием
*/
void task3(int p1, int p2, char x) {
    //std::locale::global(std::locale("rus_rus.1251"));
    setlocale(LC_ALL,"Russian");
    codecvt_byname<wchar_t, char, mbstate_t> * code = new codecvt_byname<wchar_t, char, mbstate_t> ("en_EN.UTF-8");
    locale utf8locale(locale(), code);
    vector<wstring> texts = readStrings(utf8locale);
 
    wifstream input("../countryInfo.txt");
    wofstream html("my.html");
 
    input.imbue(utf8locale);
    html.imbue(utf8locale);
 
    vector<country> countries;
    while (!input.eof()) {
        wstring str;
        getline(input,str);
        if (str.length() > 0 && str.at(0) != '#') {
            wstringstream ss(str);
            country c;
            ss >> c.iso2;
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            getline(ss, c.title, wchar_t('\t'));
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            ss >> c.population;
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            getline(ss, c.tld, wchar_t('\t'));
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            ss.ignore(5000,'\t');
            getline(ss, c.geonameid, wchar_t('\t'));
 
            if(p1 <= c.population && c.population <= p2)
                if(c.tld[1]==x)
                countries.push_back(c);
        }
    }
    input.close();
 
    sort(countries.begin(), countries.end(), titleSort);
 
    html << "<!doctype html>" << endl;
    html << "<html><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /><head>";
    html << "</head>"<<endl;
    html << "<body>"<<endl;
    html << "<h1>" << "Country" << "</h1>"<<endl;
    html << "<table border=\"1\">";
    html << "<tr><td>" << "<b>Number</b>" << "</td><td>" << "<b>Title</b>" << "</td><td>" << "<b>Geonameid</b>" << "</td><td>" << "<b>Iso2</b>" << "</td><td>" << "<b>Tld</b>" << "</td><td>" << "<b>Population</b>"<< "</td></tr>" << endl;
 int n=1;
    for (vector<country>::iterator s = countries.begin(); s != countries.end(); s++) {
        html << "<tr><td>" << n++ << "</td><td>" <<(*s).title << "</td><td>" << (*s).geonameid << "</td><td>" << (*s).iso2 << "</td><td>" << (*s).tld << "</td><td>" << (*s).population << "</td></tr>" << endl;
    }
 
    html << "</table>";
    html << "</body>";
}
 
 
 
//////////////////////////////////////////////////////////////////////////////
//////////////////// Запуск заданий //////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
 
bool checkFile() {
    bool ret = true;
    FILE* sourceFile;
    ret = !fopen_s(&sourceFile,"../countryInfo.txt","r");
    fclose(sourceFile);
    return ret;
}
 
int main() {
    int p1, p2;
    char x;
    cin >> p1; cin >> p2; cin >> x;
    if (checkFile()) {
        task1();
        task2();
        task3(p1,p2, x);
    } else {
        cout << "Oops, file not opened - check, is it in solution folder." << endl;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2012, 16:51     Работа с файлами
Посмотрите здесь:

Работа с файлами. C++
работа с файлами C++
C++ Работа с файлами
Работа с файлами C++
C++ Работа с файлами
C++ работа с файлами
C++ Работа с файлами
работа с файлами C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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