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

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

Войти
Регистрация
Восстановить пароль
 
Pupsen
Сообщений: n/a
#1

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

07.07.2012, 16:51. Просмотров 463. Ответов 0
Метки нет (Все метки)

Надо исправить работу по заданию.

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++
Как выводить данные через цикл while (!file.eof()) ? (можно просто пример кода )

Работа с файлами - C++
Здравствуйте, суть в том что необходимо сделать что-то типо копирования произвольного файла, т.е. выбираю файл будь то изображение,...

Работа с файлами - C++
В магазине имеются различные товары, причем каждому товару в качестве названия присвоен целочисленный код. Для контроля за наличием...

Работа с файлами. - C++
В файле некоторое количество целых чисел. Написать программу которая находит наибольшее, наименьшее значение, и вычисляет среднее...

С++ Работа с файлами - C++
Напишите программу, которая принимает на вход четыре параметра: имя входного файла, имя выходного файла, два слова a и b. Программа должна...

C++ работа с файлами - C++
Задача с чтением и записью данных из файла в файл. Созданы 2 файла, в первом есть данные, во втором пусто. Написать программу, которая...

Работа с файлами. - C++
Всем Доброго времени суток. С сегодняшнего дня в инсте стали задавать задачи, на работу с файлами. Раньше с таким не сталкивался, поэтому...

Работа с файлами С++ - C++
Написать программу для сжатия какого-либо файла в 2 раза.

Работа с файлами - C++
Привести пример создания, просмотра и дополнения числового файла на языке С++

работа с файлами - C++
подскажите пожалуйста a. В текстовом файле хранятся квадратные вещественные матрицы порядка n (n – const). Преобразовать файл, удалив...

Работа с файлами - C++
Здравствуйте! Подскажите какие нибудь сторонние библиотеки для работы с файлами. Мне нужно реализовать систему сохранения/загрузки данных,...


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

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

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