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

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

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

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

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

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

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

Огромное Вам спасибо :-)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2013, 03:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обновление счётчика при записи в файл (C++):

Баг при использовании класса string при записи в бинарный файл - C++
При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе использовался класс string, то в конце...

Абракадабра при записи в файл и при чтении из него кириллицы - C++
#include <iostream> #include <fstream> using namespace std; int main() { ofstream f("text.dat"); f << "Тест"; ...

Знаю что информация неправильно преобразовывается при записи в файл, скорее всего и при считывании тоже. Как это исправить? - C++
Знаю что информация неправильно преобразовывается при записи в файл, скорее всего и при считывании тоже. Как это исправить? Вот что...

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

Ошибка при записи в файл - C++
помогите, вылетает ошибка при записи в файл ф-я void add_in_file(int n) что не так? #include <iostream> #include <conio.h> ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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);
Скажете, в чём ошибка?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 18:53 #8
Цитата Сообщение от fktrctq0321 Посмотреть сообщение
Написал же, что не знаю как конкретно в данном случае сделать это.
Там где вы это написали, я не вижу кода из 2-го поста. Здесь форум С++, а не С. На этом, пожелаю вам удачи...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 18:53
Привет! Вот еще темы с ответами:

Ошибка при записи данных в файл - C++
Для записи перменной типа string выделяю динамически массив из 64 элементов char,после записи данных освобождаю память,но почему-то при...

Лишние символы при записи в файл - C++
void Add_department::OnBnClickedOk() { char seps = &quot;:&quot;; char *token; char* file_name = &quot;D:\\department.txt&quot;; char...

С++ и Stack overflow при записи в файл - C++
Есть функция, которая заполняет XML файлы и следующей упаковке их в *.odt(OpenOffice Writer) Так вот на 1700+ итерации StackOverflow... и...

Перевод строки при записи в файл - C++
Почему при выводе на экран оператор endl; переводит строку на новую, а при записи в файл не переводит, а печатает всё в строчку ? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.09.2013, 18:53
Ответ Создать тему
Опции темы

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