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

Глава 3 стр 26

С++ не хуже ассемблер

Теперь напишем программу на С++ такую же как программа из предыдущей главы.
То есть чтение графич файла в массив в памяти и далее из массива в памяти
в текстовый файл предварительно преобразовав в 16-ричное значение. Выходной файл
будет выглядеть как в отладчике.

То есть напишем программу, которая дает матричное отображение bmp-файла.

Для этого надо знать такие темы:

Чтение из файла и запись в файл
Работа с массивами
Сохранение в переменной значения из массива.

/////////////////////

Вот отрывок, в котором считывание из файла(и запись)
происходит посимвольно:

ifstream from1(FileName1);//открываем файл для считывания
if(!from1) {

cout<<"Vhodnoi fail ne naiden:" ;
}
ofstream to1(FileName2,ios::app);//открываем файл для записи
if(!to1) {
cout<<"Vyhodnoi fail ne otkryt:" ;
}

char ch;
while (from1.get(ch)) {

to1.put(ch);
}

Здесь инструкция from1.get(ch) помещает следующий символ из файла в переменную ch.
Затем эту переменную может быть можно поместить в массив или иной контейнер,
смещая индекс массива. Таким образом поместить в массив весь файл.

Для построчного считывания есть другая функция:

from1.getline(buf,sizeof(buf));

Эта функция считывает из входного потока строку и помещает ее в символьный массив buf.

Во всех трех функциях get(), put(), getline() работа происходит с символьными массивами.
Кажется мне это подходит.

////////////////////////////

Уже можно написать программу в которой объявляем символьный массив buf
и считаем в него из файла 54 байта. А можно считать весь файл и посмотреть этот
массив в отладчике.

Поскольку считывание из файла будет происходить посимвольно, то и для сохранения
результата создадим символьный массив buf. Для хранения одиночного считанного символа
создадим еще вспомогательный массив buf1. Для копирования из временного массива buf1 в
массив buf воспользуемся известной функцией strcpy(). Эта функция, впрочем, работает с
указателями на массив, поэтому введем еще два указателя и настроим их на
соответствующие массивы.

Код записи из входного потока в массив будет таким:

//////////////////
const int len = 3000;
char buf[len];
char *p = buf;//сорентируем указатель на начало массива buf

char buf1[2];
char *p1 = buf1;//сорентируем указатель на начало массива buf1

char ch;

while (from1.get(ch)) {

buf1[0] = ch;
strcpy(p,p1); //вставим
p++;
}

Здесь сразу возникает подводный камень, на который мы можем наткнуться. Дело в том,
что функция get() будет считывать символы пока не встретит конец файла, а файл может
оказаться большим. Символы могут не поместиться в наш массив, и тогда произойдет
переполнение массива и все связанные с этим неприятности. Чтобы этого не произошло
воспользуемся простым приемом - выйдем из цикла считывания, если число символов превысит размер массива:

int n = 0;

while (from1.get(ch)) {

buf1[0] = ch;
strcpy(p,p1); //вставим
p++;
n++;
if(n>=len)break;
}

Благодаря переменной n мы сосчитали число считанных в массив символов, и можем сообщить об этом:

cout<<"Считано :" << n << " символов" << endl ;

Итак, наша программа теперь выглядит так:


// копируем посимвольно из файла в массив
#include <fstream.h>
#include <iostream.h>
#include <string.h>

int main( int argc,char* argv[]) {

ifstream from1("bukva.bmp");//открываем файл для считывания
if(!from1) {

cout<<"Vhodnoi fail ne naiden:" ;
return (1);
}
ofstream to1("text2" ); // open for writing
if(!to1) {
cout<<"Vyhodnoi fail ne naiden:" ;
to1.close(); // always pays to be tidy
return (1);
}
//////////////////
const int len = 3000;
char buf[len];
char *p = buf;//сорентируем указатель на начало массива buf

char buf1[2];
char *p1 = buf1;//сорентируем указатель на начало массива buf1

char ch;
int n = 0;

while (from1.get(ch)) {

buf1[0] = ch;
strcpy(p,p1); //вставим
p++;
n++;
if(n>=len)break;
}

cout<<"n :" << n << endl ;

char ch1;
cout<<"Yype any char"<< endl ;
cin>>ch1;

////////////////////
from1.close(); // always pays to be tidy
to1.close(); // always pays to be tidy

return 0;

}

Все достаточно просто и понятно.


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

Hosted by uCoz