Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ios::ate стирает файл 
V
    Опции темы
yngwie19
Дата 9.10.2010, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Добрый день, имею проблемы с флагом ios::ate, который по документации должен просто переместить указатель файла в конец, при этом сам файл не очищать. Но после такого кода:
Код

ofstream outCreditFile("credit.dat", ios::ate);
    if(!outCreditFile)
    {
        cerr << "Файл открыть не удалось" << endl;
        exit(1);
    }
        outClient.close();
 
Файл credit.dat полностью очищается. Подскажите в чем дело?
P.S: изначально файл credit.dat содержал данные порядка 5 kb. 
PM MAIL   Вверх
boostcoder
Дата 9.10.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(yngwie19 @  9.10.2010,  21:38 Найти цитируемый пост)
Подскажите в чем дело?

в -
Цитата(yngwie19 @  9.10.2010,  21:38 Найти цитируемый пост)
ofstream


PM WWW   Вверх
yngwie19
Дата 9.10.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



boostcoder, можно по конкретнее?
PM MAIL   Вверх
boostcoder
Дата 9.10.2010, 22:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



если тебе нужно читать файл - используй ifstream

и про спасибо не забываем.
PM WWW   Вверх
yngwie19
Дата 9.10.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



boostcoder,
спасибо за ответ, но в том то и дело, что мне нужно записывать в файл в определенную позицию. 
PM MAIL   Вверх
boostcoder
Дата 9.10.2010, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Код

std::fstream file("", std::ios::app|std::ios::ate);

проверь.
PM WWW   Вверх
yngwie19
Дата 9.10.2010, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



boostcoder, так не стирается, но данные записываются только в конец, а мне нужно в определенную позицию. Видимо ios::app не даст переместить указатель.
PM MAIL   Вверх
boostcoder
Дата 9.10.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(yngwie19 @  9.10.2010,  22:31 Найти цитируемый пост)
Видимо ios::app не даст переместить указатель.

покажи как перемещаешь его?
PM WWW   Вверх
yngwie19
Дата 9.10.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Код

struct clientData
{
    int account;
    char firstName[20];
    char lastName[20];
    float balance;
};

outCreditFile.seekp((client.account - 1)*sizeof(clientData));

PM MAIL   Вверх
Crafty
Дата 9.10.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Код

  fstream myfile("temp.txt", ios::out|ios::in|ios::ate);
  myfile.seekp(3);
  myfile << 9;

Про seekp тут посмотри.

Думаю можно еще просто открыть файл и записывать вот так seekp(-1, fstream::end);

Это сообщение отредактировал(а) Crafty - 9.10.2010, 23:11
PM MAIL   Вверх
boostcoder
Дата 9.10.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



ясно.
попробуй так:
Код

std::fstream file("", std::ios::in|std::ios::out|std::ios::ate);

PM WWW   Вверх
yngwie19
Дата 9.10.2010, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(boostcoder @  9.10.2010,  23:00 Найти цитируемый пост)
ясно.
попробуй так:

Ураааа, спасибо большое получилось! А почему через
Код

 ofstream outCreditFile("credit.dat", ios::ate);

не работало?
P.S: Вам плюсик!
PM MAIL   Вверх
bsa
Дата 9.10.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



yngwie19, seek почти бесполезна для текстовых файлов! так как у тебя запись может иметь минимальный размер 12/13 байт (*nix/windows соответственно: "1 a b 0.1\n"), а максимальный раз в 10 больше. То что ты вычисляешь положение через sizeof структуры, ты не помогаешь себе. Будет возвращен размер занимаемой структурой памяти (кстати, это далеко не всегда sizeof(int)+20+20+sizeof(float)), а ты при записи (через file << account << first << last << balance) делаешь форматированный вывод.
Если же ты записываешь в двоичный файл, то:
1. расширение .txt не самое удачное для такого типа файлов
2. открывать файл надо с опцией ios::binary, чтобы под Windows символ с кодом 10 не превращался в два (один 13, другой 10) при записи, а при чтении наоборот - два в один.
PM   Вверх
boostcoder
Дата 9.10.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(yngwie19 @  9.10.2010,  23:11 Найти цитируемый пост)
А почему через
код C++
 ofstream outCreditFile("credit.dat", ios::ate);

не работало?

потому что файл открывался в режиме чтения. хотя это странно. я ведь ни указал не std::ios::in не std::ios::out.. хз smile

Добавлено @ 23:20
полностью согласен с bsa.
я сразу не смог правильно ответить, из-за того что никогда не использовал плюсовые файловые объекты для дозаписи в существующий файл.
если же вам действительно нужно хранить в файл разнотипную информацию, используйте boost.serialization, или какую-то простенькую БД, типа sqlitepp.

Это сообщение отредактировал(а) boostcoder - 9.10.2010, 23:22
PM WWW   Вверх
yngwie19
Дата 9.10.2010, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



bsa, Мне в принципе это и нужно, таким образом я делаю файл произвольного доступа, пусть память в этом случае расходуется не рационально, но по крайней мере я всегда смогу быстро перейти к определенной записи и сделать с ней все что угодно (обновить, сделать пустой). 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.