Я пытаюсь удалить заголовок из файла изображения, который содержит простой текстовый заголовок, за которым следует двоичная информация об изображении. В качестве предвестника этого я хотел бы скопировать информацию о файлах в поток строк для редактирования. При этом я столкнулся с некоторыми проблемами, из-за которых я попытался просто прочитать файл и снова записать его в виде нового файла для целей отладки. Когда я сделал это, новый файл оказался примерно на 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();
....
Спасибо за любую помощь!
-Давид
Пытаться 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();
}
Других решений пока нет …