Назад | Начало урока | Вперед
Содержание

Глава 3 стр 31

Заменяем массив на вектор

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

Есть такое программистское правило: используй вектор везде, где используется массив.
Вектор имеет массу преимуществ перед жестко заданным массивом. Во первых не фиксированная
жестко длина (вектор увеличивается автоматически по мере надобности). А самое главное -
безопасность при записи данных. При записи в вектор, а так же при считывании - невозможно
выйти за границы вектора. Все это контролируется автоматически.

Напишем новую программу. Теперь вместо массива используем вектор.
А код объявления вектора и инициализации вектора из файла прост, всего три строки:

vector charVec;
char ch;

//считаем из файла в вектор
while (from1.get(ch)) {

charVec.push_back(ch);
}

Здесь уже точно данные будут считаны до конца файла.
И обратите внимание на лаконичность кода! Таков С++!

Ну и далее чтение данных из вектора:

////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
int temp = 0;
int temp_l = 0;
int temp_h = 0;
int size_file = 0; //размер исходного bmp-файла (2-й, 3-й байты)
int chislo_str = 0; //размер картинки в байтах (34-й, 35-й байты)
int size_card = 0; //количество строк в картинке (22-й, 23-й байты)
int dlina_str = 0; //длина строки в выходном файле

char first_ch = ' ';
char second_ch = ' ';

//--------------------------------
//считаем данные из префикса файла
temp_l = (int)charVec[2];
if(temp_l<0)

temp_l = 256+temp_l;
temp_h = (int)charVec[3];
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
size_file = temp_h+temp_l;

temp_l = (int)charVec[22];
if(temp_l<0)

temp_l = 256+temp_l;
temp_h = (int)charVec[23];
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
chislo_str = temp_h+temp_l;

temp_l = (int)charVec[34];
if(temp_l<0)

temp_l = 256+temp_l;
temp_h = (int)charVec[35];
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
size_card = temp_h+temp_l;

dlina_str = size_card/chislo_str;
//-------------------------------------------------

//выведем вектор (массив) в файл в 16-ричном виде
int k = 0;
for(int i=54;i < size_file;i++){

temp = (int)charVec[i];
if(temp<0)
temp = 256+temp;
filter(temp,first_ch,second_ch);
to1 << first_ch << second_ch ;
k++;
if(k==dlina_str){//перевод строки
k=0;
to1<< " " << endl ;
}
}

Полностью смотрите код этой замечательной программы на следующей странице.
Exe-файл этой программы так же можно скачать здесь.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz