Ответ 1
Вы падаете с ограничениями на смешивание чтения и
записывать операции в файл, открытый в режиме обновления, что MS fstream
библиотека наследует от реализации C <stdio.h>
.
Стандарт C (я цитирую C99, но он не отличается в этом пункте от C89) в 7.19.5.3/6 состояния:
Когда файл открывается с режимом обновления ('+' в качестве второго или третьего символа в выше списка значений аргумента режима), как вход, так и выход могут выполняться на связанный поток. Тем не менее, вывод не должен сопровождаться вводом без промежуточный вызов функции fflush или функции позиционирования файла (fseek, fsetpos или перемотка назад), и вход не должен напрямую сопровождаться выходом без промежуточный вызов функции позиционирования файла, если только входная операция не встречает конечный результат, из файла.
(мой акцент).
Итак, ваше решение stream.seekp(1)
, которое переходит на C fseek
, является правильным.
В библиотеке GNU C нет этого стандартного ограничения, поэтому ваш код, который опубликован, работает как и ожидалось при построении с помощью GCC.
Библиотека MS <fstream>
совместима со стандартом С++ в наследовании
это ограничение. fstream
реализованы с использованием basic_filebuf<charT,traits>
. В стандартной (С++ 11) стандартной учетной записи этого шаблона в § 27.9.1.1.2 он просто говорит:
Ограничения на чтение и запись последовательности, управляемой объектом класса basic_filebuf, те же, что и для чтения и записи с файлами F библиотеки Standard C.