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

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

Войти
Регистрация
Восстановить пароль
 
fktrctq0321
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 37
#1

Обновление счётчика при записи в файл - C++

15.09.2013, 03:56. Просмотров 309. Ответов 7
Метки нет (Все метки)

Товарищи форумчане! Бросаю Вам флаг помощи.
Проблема такого плана: ведётся запись массива структур в файл. В начале файла записывается число этих самых структур, которые непосредственно входят в массив структур :-)
Например, структура "Имя". Запрашивается, сколько имён будет введено и это число помещается в начале файла. Ну а дальше записываются непосредственно сами элементы структур (в данном случае, имена).

Всё бы ничего, только этот счётчик имён нужно будет впоследствии обновить. Необходимо будет провести операцию добавления имён (получается, счётчик уже не будет соответствовать реальности после добавления). Так вот интересует вопрос: как его перезаписать в начале файла без потери данных?
Это очень важно, т.к. в моём проекте (сразу скажу, что это не так всё просто как на именах - это просто банальный пример) - это самый последний мелкий нюанс, над которым не могу справиться, но он очень важен.

Огромное Вам спасибо :-)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 06:05     Обновление счётчика при записи в файл #2
Для примера код функции, в которой происходит добавление записей (дисков) в файл. В начале файла записано количество записей (дисков) в файле. При добавлении новых, эта запись перезаписывается:
Кликните здесь для просмотра всего текста
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
void addvd() // создание базы и добавление дисков
{   
    cout << "\n\nКоличество dvd дисков = ";
    int t; // количество добавляемых дисков
    (cin >> t).get();
 
    int n = 0; // количество дисков в файле (записывается в первой строке)
  
  //запись в файл
 fstream f("f.txt", ios::in | ios::out | ios::binary);
 if (!f.is_open()) // если файла не существует
 {
    f.open("f.txt", ios::out | ios::binary);
    f.write((const char*)&t, sizeof(t)); // записываем в файл количество дисков
    f.close();
 }
 else // если файл существует
 {
    f.read((char*)&n, sizeof(n));         // читаем количество дисков в файле
    f.seekg(0);                          // возвращаем курсор в начало файла
    n += t;                              // новое количество дисков в файле
    f.write((const char*)&n, sizeof(n)); // записываем новое количество дисков в файле
    f.close();
 }
 
 f.open("f.txt", ios::app); // открываем файл для дозаписи
 
 
 for(int i = 0; i < t; i++)
 {  
    dvd temp;
 
    cout << "\nНазвание фильма: ";           getline(cin, temp.namefilm);  f << temp.namefilm << '\n';
    cout << "Имя режисера: ";                getline(cin, temp.namereg);   f << temp.namereg  << '\n';
    cout << "Продолжительность в минутах: "; cin  >> temp.prodol;          f << temp.prodol   << '\n';
    cout << "Цена: ";                        (cin >> temp.cena).get();     f << temp.cena     << '\n';
 }
 
 f.close(); 
 
}
fktrctq0321
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 37
15.09.2013, 17:31  [ТС]     Обновление счётчика при записи в файл #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Для примера код функции, в которой происходит добавление записей (дисков) в файл. В начале файла записано количество записей (дисков) в файле. При добавлении новых, эта запись перезаписывается:
Кликните здесь для просмотра всего текста
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
void addvd() // создание базы и добавление дисков
{   
    cout << "\n\nКоличество dvd дисков = ";
    int t; // количество добавляемых дисков
    (cin >> t).get();
 
    int n = 0; // количество дисков в файле (записывается в первой строке)
  
  //запись в файл
 fstream f("f.txt", ios::in | ios::out | ios::binary);
 if (!f.is_open()) // если файла не существует
 {
    f.open("f.txt", ios::out | ios::binary);
    f.write((const char*)&t, sizeof(t)); // записываем в файл количество дисков
    f.close();
 }
 else // если файл существует
 {
    f.read((char*)&n, sizeof(n));         // читаем количество дисков в файле
    f.seekg(0);                          // возвращаем курсор в начало файла
    n += t;                              // новое количество дисков в файле
    f.write((const char*)&n, sizeof(n)); // записываем новое количество дисков в файле
    f.close();
 }
 
 f.open("f.txt", ios::app); // открываем файл для дозаписи
 
 
 for(int i = 0; i < t; i++)
 {  
    dvd temp;
 
    cout << "\nНазвание фильма: ";           getline(cin, temp.namefilm);  f << temp.namefilm << '\n';
    cout << "Имя режисера: ";                getline(cin, temp.namereg);   f << temp.namereg  << '\n';
    cout << "Продолжительность в минутах: "; cin  >> temp.prodol;          f << temp.prodol   << '\n';
    cout << "Цена: ";                        (cin >> temp.cena).get();     f << temp.cena     << '\n';
 }
 
 f.close(); 
 
}
спасибо
только тут операции чтения/записи/добавления идёт через функции fstream. Следовательно, "обновление" счётчика тоже.
а как можно сделать аналогичное через функции FILE?
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 17:56     Обновление счётчика при записи в файл #4
Цитата Сообщение от fktrctq0321 Посмотреть сообщение
а как можно сделать аналогичное через функции FILE?
Аналогично. Если функции чтения\записи знаете, то переделать несложно.
fktrctq0321
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 37
15.09.2013, 18:30  [ТС]     Обновление счётчика при записи в файл #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Аналогично. Если функции чтения\записи знаете, то переделать несложно.
Не то, чтобы не знаю функции, но конкретно в этом случае "обновить" счётчик не получается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cout << "Сколько хотите стран добавить?\t";
unsigned short number_country;
cin >> number_country;
               
FILE *f;
f=fopen("info.txt","r");
int n=0;
fscanf(f,"%i",&n);
 
/*вот тут к n необходимо прибавить number_country и перезаписать в начале файла, 
не теряя (!) данных после. Не знаю, как это слелать.*/
fclose(f);
        
 
//дозапись
FILE *f_in; 
f_in=fopen("info.txt","at");
//и так далее...
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 18:40     Обновление счётчика при записи в файл #6
Цитата Сообщение от fktrctq0321 Посмотреть сообщение
Не то, чтобы не знаю функции,
Раз знаете, то берёте код (2 пост) и переделывате его под С.
fktrctq0321
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 37
15.09.2013, 18:45  [ТС]     Обновление счётчика при записи в файл #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Раз знаете, то берёте код (2 пост) и переделывате его под С.
Написал же, что не знаю как конкретно в данном случае сделать это. Не получается вначале файла перезаписать число подобным образом:
C++
1
2
n=n+number_country;
n=fseek(f,0L,SEEK_SET);
Скажете, в чём ошибка?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 18:53     Обновление счётчика при записи в файл
Еще ссылки по теме:

Проверка на повтор при записи в файл C++
Ненужные символы при записи в файл C++
При записи Лога не заполняется файл C++
Мусор при записи значений в файл C++
Неверная кодировка при записи в файл C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 18:53     Обновление счётчика при записи в файл #8
Цитата Сообщение от fktrctq0321 Посмотреть сообщение
Написал же, что не знаю как конкретно в данном случае сделать это.
Там где вы это написали, я не вижу кода из 2-го поста. Здесь форум С++, а не С. На этом, пожелаю вам удачи...
Yandex
Объявления
15.09.2013, 18:53     Обновление счётчика при записи в файл
Ответ Создать тему
Опции темы

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