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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Можно ли заменить обращение к Union без указания типа переменной? http://www.cyberforum.ru/cpp/thread1113277.html
Можно ли заменить обращение к Union без указания типа переменной?(т.е. без .i .f .str, а просто к "data") #include <stdio.h> #include <string.h> union Data { int i; float f; char str; };
C++ Нужно разобраться с средой разработкой для C++ Привет Всем ! Если я не ошибаюсь то с .NET 2003 (VS 7.1) шапки языка C++ немного изменился, и разница была следующая: 1. до: #include <iostream.h> void main(void) ...... и т.д... 2. после: #include <iostream> http://www.cyberforum.ru/cpp/thread1113231.html
Libxl.h как подключить? C++
Помогите подключить библиотеку к Visual C++ 2012 Или даже так - помогите разобраться с тем как парсить с xls файлов.
Ошибка с распределением цикла по потокам в Open MP C++
нужно цикл for разделить м/у потоками,но почему то ошибки выдает ,первый раз с Open MP работаю,подскажите как исправить ,пожалуйста... пишу на VS 2010 Ultimate ошибки:Ошибка 4 error C3004: shared: предложение не допускается в директиве OpenMP "for" Ошибка 5 error C3017: неверный вид проверки завершения в операторе For директивы OpenMP #pragma omp parallel { #pragma omp for...
C++ Надзиратель томагавков или что за велосипед я изобрел? http://www.cyberforum.ru/cpp/thread1109791.html
She's alive! Господа, в общем вдохновился я темой programina про статические поля класса и решил создать что-то похожее на сборщик мусора. По скольку я придерживаюсь мнения, что порою лучше сперва самому поковыряться, а потом уже почитать как правильно надо было сделать, то вот такой у меня получился уродец. Долго думал куда можно его применить в качестве примера. Придумал - класс-томагавк....
C++ Получение из файла формата wav массива значений Столкнулся со следующей задачей, требуется получить из wav файла массив значений. Сам владею Си на примитивном уровне, по этой причине решить данную задачу самостоятельно не могу, поиск в гугле ничего не дал (или просто я не увидел решения). Надеюсь на вашу помощь. подробнее

Показать сообщение отдельно
StailGot
27 / 22 / 6
Регистрация: 25.08.2013
Сообщений: 41
15.03.2014, 18:04     Почему функция seekp() работает только с классом ostringstream и не хочет использоваться с ofstream
Цитата Сообщение от 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"
 
Текущее время: 00:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru