Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
1

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

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

Всем привет!

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

P.S. Кстати, почему если при открытии файла использовать флаг std::ios_base::ate файл перезаписывается? Он ведь должен выставлять указатель на конец файла, оставляя возможно переместить его?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2014, 19:06
Ответы с готовыми решениями:

Почему-то работает только последняя функция. В чем проблема?
Изучаю JS, решил написать скрипт который будет писать "Right", "Forward" и т.д. в зависимости от...

Почему первая функция работает, только если вторая закомментирована?
здрасте, подскажите почему первая функция работает только если вторая закоменчена z5:: Char ->...

не работает функция с классом
Всем добрый вечер! Не могу понять, почему функция change в нижеприведенной программе не работает,...

Почему компиллятор выдает ошибку и не хочет что бы функция принимала 2 переменных
#include "stdafx.h" #include <iostream> #include <iomanip> #include <conio.h> using namespace...

5
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
12.03.2014, 18:58  [ТС] 2
Почему так?
0
Каратель
Эксперт С++
6601 / 4020 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.03.2014, 00:13 3
какие ваши доказательства? УМВР
0
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
13.03.2014, 20:50  [ТС] 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 в этой ситуации не работает? По описанию он именно для этого создан.
0
28 / 23 / 12
Регистрация: 25.08.2013
Сообщений: 44
15.03.2014, 18:04 5
Лучший ответ Сообщение было отмечено BESSON_off как решение

Решение

Цитата Сообщение от 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"
0
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
17.03.2014, 19:21  [ТС] 6
мир Вам!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2014, 19:21

Не работает seekp()
Здорова господа!!! У меня вообщем проблемка я от отрываю файл для редактирования ios::app курсор...

Класс: Почему этот operator+ не хочет работать как функция внутри класса?
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class complex{ private: int...

Почему в Visual studio 2010 работает,а в 6.0 не хочет,с++
Помогите решить эту проблему, заранее спасибо всем #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Почему скрипт работает на одном и том же домене, а на другом не хочет?
почему скрипт работает на одном и том же домене, а на другом не хочет??? У меня есть рабочий...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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