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

"вставка" с "заменой" текста в файле. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Case http://www.cyberforum.ru/cpp-beginners/thread359061.html
Можно ли как то в конструкции switch case задавать условие например case n<0:и выполнить действие
C++ Поместить в массив с[m] коэффициенты произведения двух многочленов. В массивах a и b хранятся коэффициенты двух многочленов степеней k и l. Поместить в массив с коэффициенты их произведения. (Числа k, l, m - натуральные, m = k + 1; элементы массива с индексом i... http://www.cyberforum.ru/cpp-beginners/thread359057.html
Как запустить программу с параметрами? C++
Как запустить программу: srcds.exe ( путь D:\csserver\server) С параметрами: -console -game cstrike -port 27015 +maxplayers 24 +map de_dust2 +sv_lan 0 + log on -32bit -tickrate 66 . В консольном...
Массив объектов C++
Создать массив объектов разного типа невозможно. Но, наверное, можно создать массив объектов, поле которых, будет содержать указатель на объекты разных типов. Такое можно реализовать через...
C++ Определить количество чисел, встревающих в заданной матрице более одного раза http://www.cyberforum.ru/cpp-beginners/thread359038.html
Дана целочисленная прямоугольная матрица. Определить: 1) Количество строк, содержащих хотя бы один нулевой элемент 2) количества чисел, встревающих в заданной матрице более одного раза. Вот я...
C++ Vector string'ов и освобождение памяти Как известно вектор не освобождает память. В подавляющем большинстве случаев string работает на основе вектора (т.к. если использовать list - хранить на каждый байт по 2 указателя весьма не... подробнее

Показать сообщение отдельно
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
01.10.2011, 20:10
Цитата Сообщение от Razzeeyy Посмотреть сообщение
мысль складывать всё содержимое файла в какой нибудь string buffer и уже по нему потом искать и с ним работать. а при завершении работы просто перезаписывать файл содержимым string buffer
Надо именно так делать, если конфиг-файл весил бы до 100MB то можно было просто работать с файлом, сам по себе файл не может сжиматься или расширяться только затирать старое значение пробелами или нулями любым символом, в итоге будут создаваться множество пустых фрагментов ну как в БД боряться с фрагментацией. Одно дело БД другое килобайтный конфиг-файл, вот пример набросал в начале весь конфигурационный файл считывается в карту map, уникальными ассоциативными ключами далее пример сохранения карты в конфиг с перезаписью всего файла. как и должно быть, не надо постоянно головку диска гонять если озу-память за 1GB переваливает, да и скорость работы диска на много медленнее озу.
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
#include <fstream>
#include <map>
#include <iostream>
#include <string>
using namespace std;
 
map<string, string> config;
 
int  main(void) {
 
    fstream  fp("D:\\config.txt", fstream::in); 
    if(! fp.is_open())
         exit(1);
 
    string line;
    char key[64], value[255];
    while(! fp.eof()) {
          getline(fp, line);
          if(sscanf(line.c_str(), "%[^ ]%*[^\"]\"%[^\"]\"", key, value) >= 2) 
                 config[key] = value;
     }
     fp.clear();
     fp.close();
 
      // вот так получать доступ по имени ключа
     cout << '\t' << config["section"].c_str() << endl;
     cout << '\t' << config["value1"].c_str()  << endl;
 
     // показать пары ключ = значение
     map<string, string>::iterator iter = config.begin();
     while(iter != config.end()) {
             cout << iter->first.c_str() << '\t' << iter->second.c_str() << endl;
             *iter++;
     }
 
     // записываем новые значения
    config["section"] = "MySQL and DB2";
    config["more"]    = "sub systems";
    config["value1"]  = "200";
    config["value2"]  = "7";
 
    // файл будет перезаписан
    fp.open("D:\\config.txt", fstream::out | fstream::trunc);
    for(iter = config.begin(); iter != config.end(); *iter++) {
          line = iter->first + " \"" + iter->second + "\"\n";
          fp.write(line.c_str(), line.length());
    }
    fp.flush();
    fp.close();
    config.clear();
    cin.get();
    return 0;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru