| Глава 3 | стр 26 |
Теперь напишем программу на С++ такую же как программа из предыдущей главы.
То есть чтение графич файла в массив в памяти и далее из массива в памяти
в текстовый файл предварительно преобразовав в 16-ричное значение. Выходной файл
будет выглядеть как в отладчике.
То есть напишем программу, которая дает матричное отображение bmp-файла.
Для этого надо знать такие темы:
/////////////////////
Вот отрывок, в котором считывание из файла(и запись)
ifstream from1(FileName1);//открываем файл для считывания
char ch;
происходит посимвольно:
if(!from1) {
ofstream to1(FileName2,ios::app);//открываем файл для записи
if(!to1) {
while (from1.get(ch)) {
Здесь инструкция from1.get(ch) помещает следующий символ из файла в переменную ch.
Затем эту переменную может быть можно поместить в массив или иной контейнер,
смещая индекс массива. Таким образом поместить в массив весь файл.
Для построчного считывания есть другая функция:
from1.getline(buf,sizeof(buf));
Эта функция считывает из входного потока строку и помещает ее в символьный массив buf.
Во всех трех функциях get(), put(), getline() работа происходит с символьными массивами.
Кажется мне это подходит.
////////////////////////////
Уже можно написать программу в которой объявляем символьный массив buf
и считаем в него из файла 54 байта. А можно считать весь файл и посмотреть этот
массив в отладчике.
Поскольку считывание из файла будет происходить посимвольно, то и для сохранения
результата создадим символьный массив buf. Для хранения одиночного считанного символа
создадим еще вспомогательный массив buf1. Для копирования из временного массива buf1 в
массив buf воспользуемся известной функцией strcpy(). Эта функция, впрочем, работает с
указателями на массив, поэтому введем еще два указателя и настроим их на
соответствующие массивы.
Код записи из входного потока в массив будет таким:
//////////////////
char buf1[2];
char ch;
while (from1.get(ch)) {
const int len = 3000;
char buf[len];
char *p = buf;//сорентируем указатель на начало массива buf
char *p1 = buf1;//сорентируем указатель на начало массива buf1
strcpy(p,p1); //вставим
p++;
Здесь сразу возникает подводный камень, на который мы можем наткнуться. Дело в том,
int n = 0;
while (from1.get(ch)) {
что функция get() будет считывать символы пока не встретит конец файла, а файл может
оказаться большим. Символы могут не поместиться в наш массив, и тогда произойдет
переполнение массива и все связанные с этим неприятности. Чтобы этого не произошло
воспользуемся простым приемом - выйдем из цикла считывания, если число символов превысит размер массива:
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;
}
Все достаточно просто и понятно.
Назад |
Начало урока |
Вверх |
Вперед
Содержание