User 11061201 Ответов: 3

C++ создание копии двоичного файла чтение, запись


Привет сообщество, я пытаюсь прочитать исполняемый файл в массив Char, а затем создать исполняемый файл с этим массивом. Мой код ниже действительно читает и записывает, но выходной файл составляет всего 4 байта. Так что же мне следует изменить?

ifstream in("F:\\helloworld.exe");		
		size_t len = in.tellg();
		char *oData = new char[len + 1];
		in.seekg(0, ios::beg);
		in.read(oData, len);
		oData[len] = '\0';
		 
		printf("%d", sizeof(oData));


		ofstream out("F:\\helloworld2.exe");
		out.write((char *)oData, sizeof(oData));
		out.close();

                delete[] oData;


MODIFIED:

Теперь я изменил код следующим образом, и файл создается с тем же количеством байтов, что и оригинал. Я удалил символ '\0', так как он кажется ненужным. Теперь, когда я запускаю клон, он показывает "программа слишком велика, чтобы поместиться в памяти", и почему? Надеюсь, я не собираюсь полностью оторвать себе ноги.

ifstream in(path);	
		in.seekg(0, ios::end);
		size_t len = in.tellg();
		unsigned char *oData = new unsigned char[len];
		in.read((char*)(&oData[0]), len);
		in.close(); 
		
		size_t counted = in.gcount();
		cout << counted << endl; //result always 0 ???


		printf("\n %d", len); //same amount as original file length


		ofstream out(newP);	
		//myFile.open(newP, ios::out | ios::binary | ios::ate);
		out.write((char *)oData, len);
		out.close();


		delete[] oData;

И почему fread и fwrite не позволяют мне назначить unsigned char параметр?

Что я уже пробовал:

И вопрос, и "что вы пробовали" должны быть не менее 30 символов.

3 Ответов

Рейтинг:
2

OriginalGriff

oData-это массив символов: таким образом, это указатель на первый символ в массиве. Поскольку вы работаете с 32-битным компилятором (или, по крайней мере, производите 32-битный код), размер указателя составляет 32 бита или 4 байта. Поэтому, когда вы используете sizeof для любого указателя он вернет размер 4.

Вместо этого используйте len вместо sizeof(oData) - это уже правильная длина, потому что это размер массива, когда вы его создали!

И не используйте char для хранения двоичных данных: это семибитовое значение, а двоичные данные имеют ширину восемь бит. Воспользуйся unsigned char вместо.


[no name]

Хорошо, я задался вопросом, почему в C++ не используется байтовый массив для записи, как в .NET, так что в этом случае я должен использовать unsigned char, спасибо за совет. Я попробую свой код и покажу результат.

[no name]

Пожалуйста, подумайте над моим улучшенным вопросом.

Рейтинг:
2

Patrice T

Возможно, вам следует установить указатель файла в начало файла перед чтением.

in.seekg(0, ios::beg);
in.read(oData, len);

Проверьте, совпадает ли результирующий файл с исходным.


Рейтинг:
10

User 11061201

Может быть, это не точный ответ на вопрос, но он делает свою работу.
Код взят из StackOverflow, по отношению к автору Eutherpy
c++ - чтение двоичного файла в массив unsigned char и запись его в другой-переполнение стека[^]

ifstream in(original_path, ios::binary);
		ofstream out(clone_path, ios::binary);
		if (in.is_open() && out.is_open())
			while (!in.eof())
				out.put(in.get());
		in.close();
		out.close();