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

C++

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

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

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

Всем привет!

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

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

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

Почему компиллятор выдает ошибку и не хочет что бы функция принимала 2 переменных - C++
#include "stdafx.h" #include <iostream> #include <iomanip> #include <conio.h> using namespace std; int funk( int a, int b) ...

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

Почему в Visual studio 2010 работает,а в 6.0 не хочет,с++ - C++
Помогите решить эту проблему, заранее спасибо всем #include "stdafx.h" #include <iostream> #include <conio.h> #include <locale> ...

Почему первая функция работает, только если вторая закомментирована? - Haskell
здрасте, подскажите почему первая функция работает только если вторая закоменчена z5:: Char -> Bool z5 s = s >= 'A' && s <= 'Z' || s...

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

5
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
12.03.2014, 18:58  [ТС] #2
Почему так?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.03.2014, 00:13 #3
какие ваши доказательства? УМВР
0
BESSON_off
3 / 0 / 1
Регистрация: 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
StailGot
28 / 23 / 6
Регистрация: 25.08.2013
Сообщений: 41
15.03.2014, 18:04 #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"
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
17.03.2014, 19:21  [ТС] #6
мир Вам!
0
17.03.2014, 19:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 19:21
Привет! Вот еще темы с ответами:

Ноутбук работает только с Wi Fi роутера дома, в кафе не работает и везде. Почему? - Wi-Fi
Подскажите пожалуйста, почему у меня ноутбук с виндой 7, работает вай фай только дома с роутера. А когда я прихожу в кафе или в парк, у...

Почему case работает только с выражениями, и не работает с функциями? - Lazarus
и как быть например если хочу действовоть в зависимоти от результатов вызова функции case MyFunc(i) of 3: ...; 4: ...; default;...

Функция Хевисайда, почему интегрируем только до x? - Математический анализ
\Omega(x)= \int_{-\infty }^{x}\delta (\tau )d\tau У меня вопрос по функции Хевисайда. Больше из раздела радиотехники. Почему мы...

Почему функция срабатывает только 1 раз - JavaScript
Тесть после 5 сек выводится google но через следующие 5 сек почемуто google так и остается а должно вывести Поиск.... Помогите...


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

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

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