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

C++

Войти
Регистрация
Восстановить пароль
 
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 342
#1

Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream - C++

08.03.2014, 19:06. Просмотров 703. Ответов 5
Метки нет (Все метки)

Всем привет!

Уважаемые программисты, подскажите пожалуйста, почему функция seekp() работает только с классом ostringstream и никак не хочет использоваться с ofstream объектами?
Флаги открытия файла перепробовал все...

P.S. Кстати, почему если при открытии файла использовать флаг std::ios_base::ate файл перезаписывается? Он ведь должен выставлять указатель на конец файла, оставляя возможно переместить его?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2014, 19:06     Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream
Посмотрите здесь:

Почему-то на работает функция!( C++
Почему не работает функция? C++
Почему не работает функция? C++
Не работает seekp() C++
Почему не работает функция Matricav? C++
C++ Почему в Visual studio 2010 работает,а в 6.0 не хочет,с++
не работает функция с классом C++
почему не работает функция? C++
C++ Почему функция введена, но не работает?
Почему функция putchar(); выводит только первый символ?(Короткий код) C++
C++ Почему не работает функция getline ()?
Почему компиллятор выдает ошибку и не хочет что бы функция принимала 2 переменных C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 342
12.03.2014, 18:58  [ТС]     Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream #2
Почему так?
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.03.2014, 00:13     Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream #3
какие ваши доказательства? УМВР
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 342
13.03.2014, 20:50  [ТС]     Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream #4
Цитата Сообщение от Jupiter Посмотреть сообщение
какие ваши доказательства?
C++
1
2
3
4
5
6
7
8
9
10
11
//так работает:
ostringstream str("HELLO");
str.seekp(3);
str << 'x';
cerr << str.str();
 
//а так не работает:
ofstream fout("F:\\Test.txt",ios_base::app);
fout << "HELLO";
fout.seekp(2);
fout << 'a'; //результат HELLOa
То, что открываю файл с ключом ios_base::app - это не константа, перепробовал все. Ничего не подходит.
P.S. почему ios_base::ate в этой ситуации не работает? По описанию он именно для этого создан.
StailGot
27 / 22 / 6
Регистрация: 25.08.2013
Сообщений: 41
15.03.2014, 18:04     Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от BESSON_off Посмотреть сообщение
Флаги открытия файла перепробовал все...
Уверен ? Пробовал их комбинировать ?

Цитата Сообщение от BESSON_off Посмотреть сообщение
почему если при открытии файла использовать флаг std::ios_base::ate файл перезаписывается?
При работе с ofstream к любому флагу добавляется std::ios_base::out

Т.е. если написать,
C++
1
ofstream fout("F:\\Test.txt",  std::ios_base::ate);
то фактически получим
C++
1
ofstream fout("F:\\Test.txt",  std::ios_base::ate | std::ios_base::out);
Сам std::ios_base::out является аналогом "w" в Си, т.е. происходит очистка содержимого/создание нового файла. (truncate/create for writing)

Наличие std::ios_base::ate аналогично вызову std::fseek(file,0,SEEK_END) после успешного открытия.
27.9.1.4/3
If the open operation succeeds and (mode & ios_base::ate) != 0, positions the file to the end (as
if by calling std::fseek(file,0,SEEK_END))
Комбинация std::ios_base::app | std::ios_base::out дает "a", что значит смещение в конец при каждой операции записи, т.е. положение заданное seekp() - игнорируется.

Так что этот код вполне корректно работает:
C++
1
2
3
4
ofstream fout("F:\\Test.txt",ios_base::app);
fout << "HELLO";
fout.seekp(2);
fout << 'a'; //результат HELLOa
Если нужно дописать что-то в существующий файл в произвольное место, то подойдет
std::ios_base::in | std::ios_base::out

C++
1
2
3
4
ofstream fout("F:\\Test.txt",std::ios_base::in);
fout << "HELLO";
fout.seekp(2);
fout << 'a'; //результат HEaLO

Все возможные комбинации описанные в стандарте:
27.9.1.4

Table 132 — File open modes
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
 ios_base flag combination          stdio
binary  in   out  trunc  app       equivalent
---------------------------------------------------
              +                      "w"    truncate/create for writing
              +           +          "a"    append - writes automatically seek to EOF
                          +          "a"    
              +     +                "w"    
        +                            "r"    open for read
---------------------------------------------------
        +     +                      "r+"   open for update (reading and writing)
        +     +     +                "w+"   truncate/create for update
        +     +           +          "a+"   open or create for update - writes seek to EOF
        +                 +          "a+"
---------------------------------------------------
  +           +                      "wb"   All same as above, but in binary mode
  +           +           +          "ab"
  +                       +          "ab"
  +           +     +                "wb"
  +     +                            "rb"
---------------------------------------------------
  +     +     +                      "r+b"
  +     +     +     +                "w+b"
  +     +     +           +          "a+b"
  +     +                 +          "a+b"
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 342
17.03.2014, 19:21  [ТС]     Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream #6
мир Вам!
Yandex
Объявления
17.03.2014, 19:21     Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream
Ответ Создать тему
Опции темы

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