Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2012, 23:12   #1
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию Запись std::bitset в файл. ofstream.

Нужно считать и записать std::bitset в файл bmp. Использовать нужно именно bitset, т.к. в дальнейшем некоторые биты байта будут изменяться (пытаюсь реализовать программу для стеганографии ).

Сейчас пытаюсь просто побайтово скопировать bmp-файл. Выходной файл получается чуть больше, чем исходный. Мистика начинается с байта d5. В него почему-то записывается значение 0d. Затем продолжается копирование (уже со сдвигом на 1 байт)... Затем в байт 230 опять пишет 0d. И продолжает копирование. Дальше уже не проверял. Запускал в отладчике, ни каких левых 0d в char byte не увидел... Подскажите пожалуйста, где я ошибся?

В приложении к теме исходный и результирующий файлы.

Код:
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <bitset>

void copyBmp(std::ifstream* input, std::ofstream* output);

int main(int argc, char *argv[]){
	setlocale( LC_ALL,"Russian" );

	std::ifstream* inputBmp = new std::ifstream("romashka.bmp", std::ios_base::in | std::ios_base::binary);
	if(!inputBmp->is_open()){
        std::cerr << "Не удалось открыть файл romashka.bmp"
			<< std::endl;
        return -1;
    }

	std::ofstream* outputBmp = new std::ofstream("out.bmp", std::ios_base::out);;
	if(!inputBmp->is_open()){
        std::cerr << "Не удалось открыть файл out.bmp"
			<< std::endl;
        return -2;
    }

	copyBmp(inputBmp, outputBmp);

	inputBmp->close();
	outputBmp->close();

	std::cout<<"Усё!";

	std::cin.get();
}

void copyBmp(std::ifstream* input, std::ofstream* output){

	//размер файла
	const int sizeBit = 0x02; //здесь хранится размер изображения
	input->seekg(sizeBit);
	unsigned long lastBmpPosition;
	input->read ( reinterpret_cast<char *>(&lastBmpPosition), 4);

	unsigned int currentPos = 0;
	const int length_bitset = 8;

	while(currentPos < lastBmpPosition){
		std::bitset<length_bitset> buffer;
		input->seekg(currentPos++);
		input->read( reinterpret_cast<char*>(&buffer), 1);

		char byte = buffer.to_ulong();
		*output<<byte;

		buffer.reset();
	}

}
Вложения
Тип файла: zip bmp_copy.zip (504.0 Кб, 7 просмотров)
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...

Последний раз редактировалось sVasilich; 24.10.2012 в 23:25.
sVasilich вне форума Ответить с цитированием
Старый 25.10.2012, 09:51   #2
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Кхм. Такая проблема была под MS VisualStudio 2010. А вот в Qt Creator + Gcc работает нормально...
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 25.10.2012, 20:02   #3
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Спасибо всем, кто потратил время на чтение темы Проблема решена. Нужно было открывать выходной файл в двоичном режиме:

Код:
std::ofstream* outputBmp = new std::ofstream("out.bmp", std::ios_base::out | std::ios_base::binary);
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(C++) Ofstream, не удается вывод в файл O'neeL Помощь студентам 2 22.10.2012 23:57
Использование bitset YourLastSong Общие вопросы C/C++ 3 18.10.2011 00:40
с++ запись в бинарный файл ofstream::write Farrel Общие вопросы C/C++ 1 25.11.2010 00:19
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
Как дописывать в файл с помощь потоков? (ofstream) TwiX Общие вопросы C/C++ 3 23.12.2009 23:02