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

Перезапись части информации в файле - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
15.09.2011, 23:27     Перезапись части информации в файле #1
Доброго времени суток.

Возникла интересная проблема, как видно из заголовка темы, не могу перезаписать опредиленный кусок файла - он записывается в нужное место, но удаляется все остальное.

Итак попорядку, вот тут я записываю инфу в файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                ofstream fout("DATA.uid",ios::binary|ios::in|ios::out); //файл
                if (!fout)
                {
                    MessageBox(hDlg, "Ошибка при открытии файла.", "Ошибка", MB_OK | MB_ICONERROR);
                    return false;
                }
                if (applicationManager::app->checkPassword(password, confirm)) //пароли совпали и прошли проверку на прочность
                {
                    user.setLogin(login);
                    user.setPassword(password);
                    // позиционируемся в конец файла
                    fout.seekp(0,ios::end);
                    fout.write((char*)&user,sizeof users);  //записались в конец и закрылись
                    fout.seekp(0,ios::beg);
                    fout.close();
                    EndDialog(hDlg,0);
                    return true;
                }
Тут пытаюсь перезаписать блок:

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
                ifstream fin("DATA.uid",ios::binary); //файл
                if (!fin)
                {
                    MessageBox(hDlg, "Ошибка при открытии файла.", "Ошибка", MB_OK | MB_ICONERROR);
                    return false;
                }
                users rhs;
                unsigned short i=0;//это нам понадобиться что бы потом найти старую запись и удалить ее
                while(!fin.eof())
                {
                     fin.read((char*)&rhs,sizeof users);
                     i++;
                     if (applicationManager::app->currentUser==rhs)
                     {
                         fin.seekg(0,ios::beg);
                         fin.close();
                         ofstream fout("DATA.uid",ios::binary);
                         // нашли старого пользователя, тоесть он существует
                         // добавим пользователя заново с новым паролем
                         applicationManager::app->currentUser.setPassword(newpass);
                         fout.seekp((i-1)*sizeof users,ios::beg);
                         fout.write((char*)&applicationManager::app->currentUser, sizeof users);
                         fout.seekp(0,ios::beg);
                         fout.close();
                         EndDialog(hDlg,0);
                         return true;
                     }
                }
для ясности - users - класс, члены которого я пытаюсь записывать в файлик, applicationManager - общий класс всего приложения, остальное вроде понятно из названий.

В итоге получается что в DATA.uid остается только одна запись - последняя с измененным паролем, на том месте где была предыдущая, все до нее и после - удалилось.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2011, 23:27     Перезапись части информации в файле
Посмотрите здесь:

C++ Поиск строки в файле и её перезапись
C++ Поиск информации в файле и ее вывод
C++ Изъятие информации в файле из скобок
Перезапись строк в файле C++
C++ Вывод информации о файле
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
15.09.2011, 23:58     Перезапись части информации в файле #2
Цитата Сообщение от Spellz Посмотреть сообщение
C++
1
ofstream fout("DATA.uid",ios::binary);
Попробуй так
C++
1
ofstream fout("DATA.uid", ios::out|ios::ate|ios::binary);
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
16.09.2011, 00:43  [ТС]     Перезапись части информации в файле #3
увы не сработало

Добавлено через 19 минут
Мне кажеться, что ошибка связана с неправильным перемещением курсора в файле, не могу понять только где напортачил
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.09.2011, 06:40     Перезапись части информации в файле #4
ты файл два раза открыл (в C, например, так можно делать, если позволяет реализация)
надо открыть сразу на in out
-=ЮрА=-
Заблокирован
Автор FAQ
16.09.2011, 10:05     Перезапись части информации в файле #5
Цитата Сообщение от Spellz Посмотреть сообщение
Возникла интересная проблема, как видно из заголовка темы, не могу перезаписать опредиленный кусок файла - он записывается в нужное место, но удаляется все остальное.
- лично я не знаю никаких stream-ских методов перезаписи инфы не используя буффер или промежуточный файл(если исходный файл большого размера).
Вкратце алгоритм такой - при запуске программы скопировали в буффер(или промежуточный файл) содержимое файла данных. Затем записываем из буфера(промежуточного файла) часть инфы до вставляемого сегмента, пишем сегменты, затем записываем оставшуюся часть из буфера - всё просто и тривиально реализуемо...
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
16.09.2011, 13:24  [ТС]     Перезапись части информации в файле #6
Я тоже думал над такой реализацией, для моих файлов небольших размеров это подойдет. Но что делать, если файл и инфа будет занимать, скажем, 1гб? Хранить его в оперативке не практично. Скорее всего придеться использовать другие методы.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.09.2011, 14:27     Перезапись части информации в файле #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
лично я не знаю никаких stream-ских методов перезаписи инфы не используя буффер или промежуточный файл
tell/seek в помощь
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
16.09.2011, 16:38  [ТС]     Перезапись части информации в файле #8
Цитата Сообщение от kazak Посмотреть сообщение
tell/seek в помощь
Можно поподробнее?
-=ЮрА=-
Заблокирован
Автор FAQ
16.09.2011, 17:00     Перезапись части информации в файле #9
Цитата Сообщение от kazak Посмотреть сообщение
tell/seek в помощь
- перемещая курсор по файлу перезаписать уже записанное не выйдет!
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
16.09.2011, 21:08  [ТС]     Перезапись части информации в файле #10
Сдался и сделал через временный список, всем спасибо за помощь.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.09.2011, 04:04     Перезапись части информации в файле #11
Цитата Сообщение от Spellz Посмотреть сообщение
на том месте где была предыдущая, все до нее и после - удалилось.
Кстати, не обратил сразу внимания, удалилась как - заменилась пробелами или же в файле одна перезаписанная запись в самом начале.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- перемещая курсор по файлу перезаписать уже записанное не выйдет!
Это справедливо для режима ios::app и сишных "а""а+", при которых запись производиться строго в конец файла, в остальных случаях запись происходит по текущему положению указателя, который может быть перемещен в любое место в файле по желанию программиста без каких-либо ограничений.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2011, 12:10     Перезапись части информации в файле
Еще ссылки по теме:

Получение информации о файле C++
Можно ли осуществить перезапись строки в файле C++
Перезапись чисел в файле C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
17.09.2011, 12:10     Перезапись части информации в файле #12
Цитата Сообщение от kazak Посмотреть сообщение
Это справедливо для режима ios::app и сишных "а""а+", при которых запись производиться строго в конец файла, в остальных случаях запись происходит по текущему положению указателя, который может быть перемещен в любое место в файле по желанию программиста без каких-либо ограничений.
- да я забыл про fopen("path","rb+");
Yandex
Объявления
17.09.2011, 12:10     Перезапись части информации в файле
Ответ Создать тему
Опции темы

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