Ошибка при копировании двоичного файла с помощью ifsream и stringstream

Я пытаюсь удалить заголовок из файла изображения, который содержит простой текстовый заголовок, за которым следует двоичная информация об изображении. В качестве предвестника этого я хотел бы скопировать информацию о файлах в поток строк для редактирования. При этом я столкнулся с некоторыми проблемами, из-за которых я попытался просто прочитать файл и снова записать его в виде нового файла для целей отладки. Когда я сделал это, новый файл оказался примерно на 1 КБ больше, чем оригинал. При выполнении двоичного сравнения в UltraEdit кажется, что везде, где появляется символ HEX 0A (перевод строки), моя программа, кажется, добавила 0D (возврат каретки) прямо перед ним. Мне было интересно, в чем причина такого поведения и как его избежать, если это возможно. Ниже приведен фрагмент кода:

....
std::string inputFilename = argv[1];
std::ifstream in( argv[1],ios::out | ios::binary);
if ( in )
{
std::stringstream fileStream;
fileStream<<in.rdbuf();
cout<<fileStream.str().length(); //debugging
in.close();
ofstream myfile;
myfile.open("selfoutput");
myfile<<fileStream.str();
myfile.close();
....

Спасибо за любую помощь!
-Давид

3

Решение

Пытаться ios:in

std::ifstream in( argv[1],ios::in | ios::binary)

Или на самом деле

std::ifstream in( argv[1],ios::binary)

Что эквивалентно:

Сначала выполняет те же действия, что и конструктор по умолчанию, затем связывает поток с файлом позвонив rdbuf()->open(filename, mode | std::ios_base::in).. Если вызов open () возвращает нулевой указатель, устанавливает
SetState (failbit)

Вот мой (непроверенный) упрощенный взгляд на это:

#include <fstream>

int main(int /*argc*/, const char *argv[])
{
std::ifstream in(argv[1], std::ios::binary);
if (in)
{
std::ofstream myfile("selfoutput", std::ios::binary);
if (myfile)
myfile << in.rdbuf();
}
}

В интересах безвозмездного кода гольф и плохой стиль:

#include <fstream>
using namespace std;

int main(int /*argc*/, const char *argv[]) {
ofstream("selfoutput", ios::binary) << ifstream(argv[1], ios::binary).rdbuf();
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]