[STL] почему содержимое искажается?
От: nen777w  
Дата: 20.06.11 16:14
Оценка:
Хочу скопировать файл вот таким вот образом:
std::ifstream ifs("db11.zip", std::ios_base::in|std::ios_base::binary);
std::ofstream ofs("test.arc", std::ios_base::out|std::ios_base::binary);

std::copy(
    std::istream_iterator<char>(ifs),
    std::istream_iterator<char>(),
    std::ostream_iterator<char>(ofs)
);
Re: [STL] почему содержимое искажается?
От: Mr.Delphist  
Дата: 20.06.11 16:18
Оценка: 4 (1) +1
Здравствуйте, nen777w, Вы писали:

N>Хочу скопировать файл вот таким вот образом:

N>
N>std::ifstream ifs("db11.zip", std::ios_base::in|std::ios_base::binary);
N>std::ofstream ofs("test.arc", std::ios_base::out|std::ios_base::binary);

N>std::copy(
N>    std::istream_iterator<char>(ifs),
N>    std::istream_iterator<char>(),
N>    std::ostream_iterator<char>(ofs)
N>);
N>


http://rsdn.ru/forum/cpp.applied/4274595.1.aspx
Автор: Mr.Delphist
Дата: 17.05.11
Re: [STL] почему содержимое искажается?
От: Centaur Россия  
Дата: 20.06.11 17:04
Оценка: 6 (1) -1
Здравствуйте, nen777w, Вы писали:

N>Хочу скопировать файл вот таким вот образом:

N>std::ifstream ifs("db11.zip", std::ios_base::in|std::ios_base::binary);
N>std::ofstream ofs("test.arc", std::ios_base::out|std::ios_base::binary);

N>std::copy(
N>    std::istream_iterator<char>(ifs),
N>    std::istream_iterator<char>(),
N>    std::ostream_iterator<char>(ofs)
N>);


Для копирования файлов надо использовать boost::filesystem::copy_file. Или std::istreambuf_iterator.
Re[2]: [STL] почему содержимое искажается?
От: const_volatile  
Дата: 20.06.11 20:43
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Для копирования файлов надо использовать boost::filesystem::copy_file. Или std::istreambuf_iterator.


а ещё можно воспользоваться операторами >> или <<, которые принимают в качестве аргумента streambuf. и тогда код будет выглядеть так:

ifs >> ofs.rdbuf();
// или
ofs << ifs.rdbuf();
и не нужно помнить про skipws и прочее форматирование.
Re[3]: [STL] почему содержимое искажается?
От: nen777w  
Дата: 20.06.11 20:47
Оценка:
Здравствуйте, const_volatile, Вы писали:

_>Здравствуйте, Centaur, Вы писали:


C>>Для копирования файлов надо использовать boost::filesystem::copy_file. Или std::istreambuf_iterator.


_>а ещё можно воспользоваться операторами >> или <<, которые принимают в качестве аргумента streambuf. и тогда код будет выглядеть так:


_>
ifs >> ofs.rdbuf();
_>// или
_>ofs << ifs.rdbuf();
и не нужно помнить про skipws и прочее форматирование.


Ок. Всё это хорошо, но я специально выделил: вот таким вот образом. И это именно это и означает.

Если копнуть глубже то это означает, писал Я писал некий алгоритм преобразования одного файла в другой и тут столкнулся с багом.
Начал упрощать, доупращался до такого примитивного случая. Упрощать дальше некуда. Посмотрел в MSDN ничего не нашёл.
Дай думаю спрошу на RSDN может народ в курсе.


Так понятней?
Re[4]: [STL] почему содержимое искажается?
От: fin_81  
Дата: 21.06.11 07:06
Оценка:
N>Ок. Всё это хорошо, но я специально выделил: вот таким вот образом. И это именно это и означает.

N>

N>Если копнуть глубже то это означает, писал Я писал некий алгоритм преобразования одного файла в другой и тут столкнулся с багом.
N>Начал упрощать, доупращался до такого примитивного случая. Упрощать дальше некуда. Посмотрел в MSDN ничего не нашёл.
N>Дай думаю спрошу на RSDN может народ в курсе.


N>Так понятней?


Потоки(stream) в с++ — по умолчанию, это классы для работы с человекочитаемыми текстовыми данными (платформозависимые переводы строк, пропуск пробелов, учет локали при конвертировании и тп). И эту человекочитаемость очень трудно отключить: надо сделать кучу приседаний вокруг этого стрима, чтобы он работал как хотелось. Зачем так задумано я не знаю, и вообще потоки самая противоречивая часть в стл(?). Для работы с бинарным форматом рекомендуют работать с стримбуферами (streambuf), но там тоже иногда проскакивает эта "человекочитаемость" (баг?). Для работы с бинарным представлением файла лучше использовать что-нибудь другое, например низкоуровневые open(O_BINARY)/read/write. А стримы они такие потоки г.... .
Скорее всего, в предыдущих сообщениях тебе хотели сказать про это.
Re[5]: [STL] почему содержимое искажается?
От: nen777w  
Дата: 21.06.11 09:53
Оценка:
_>Потоки(stream) в с++ — по умолчанию, это классы для работы с человекочитаемыми текстовыми данными (платформозависимые переводы строк, пропуск пробелов, учет локали при конвертировании и тп). И эту человекочитаемость очень трудно отключить: надо сделать кучу приседаний вокруг этого стрима, чтобы он работал как хотелось. Зачем так задумано я не знаю, и вообще потоки самая противоречивая часть в стл(?). Для работы с бинарным форматом рекомендуют работать с стримбуферами (streambuf), но там тоже иногда проскакивает эта "человекочитаемость" (баг?). Для работы с бинарным представлением файла лучше использовать что-нибудь другое, например низкоуровневые open(O_BINARY)/read/write. А стримы они такие потоки г.... .
_>Скорее всего, в предыдущих сообщениях тебе хотели сказать про это.

Может быть. Но прямо никто не говорил. А на счёт приседаний. Гм...
Да согдасен, вот Mr.Delphist подсказал солюшен, незнаю откуда он это прочитал, наверно хидера STL просмотрел.
Решается конкретно та проблема вот так, (вроде не так много приседаний?):

...
std::istream_iterator<char>(ifs >> std::noskipws )
...
Re[5]: [STL] почему содержимое искажается?
От: MasterZiv СССР  
Дата: 28.06.11 19:13
Оценка:
On 21.06.2011 11:06, fin_81 wrote:

Для работы с бинарным форматом рекомендуют работать с
> стримбуферами (streambuf), но там тоже иногда проскакивает эта
> "человекочитаемость" (баг?). Для работы с бинарным представлением файла лучше
> использовать что-нибудь другое, например низкоуровневые
> open(O_BINARY)/read/write. А стримы они такие потоки г.... .

Да есть там всё, есть read/write только надо флаги выставить
при октрытии файла и void* в char* перекастовать reinterpret-ом,
)что в контексте STL-ного чистоплюйства выглядит прикольно).
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Нет, надо использовать итераторы потоковых буферов
От: igna Россия  
Дата: 01.07.11 16:21
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Возможно, срабатывает "skip witespace", поэтому часть байтов маскируется при чтении. Что если попробовать явно "задавить" такое поведение?


Не надо пробовать, надо использовать итераторы потоковых буферов, у них поведение какое надо, давить ничего не придется.

Просто заменить istream_iterator на istreambuf_iterator, а ostream_iterator на ostreambuf_iterator.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.