Internet Zone >>

Бесплатные программы, полезные ресурсы, свежие номера журнала.   Нажимай!

Как изменить формат текстового документа

Алексей Фоголь
alex_fogol@mail.ru
http://k108.ai.kharkov.ua/~faa/

При всем моем уважении к автору статьи, опубликованной в IZone65 за 2000 год, предложенная им технология перехода из формата MS-DOS в формат Windows не является безболезненной. Даже для того, чтобы однажды преобразовать один файл, необходимо совершать массу действий. Это особенно неудобно, когда подобная операция совершается часто и помногу. Подобная проблема возникла у меня во время параллельной работы в DOS и Windows, когда смена систем осуществлялась до нескольких раз на день.

Эту проблему я решил очень просто: просидев за работой 2-3 часа, я создал простую программку, производящую перекодировку текстовых файлов из DOS в Windows и обратно. Программа была написана на C++ и получила название convert.exe. Здесь я привожу ее исходный код:

 

// Convert text files WIN/DOS
// Copyright (c) 1999, 2000 by Alex Fogol, AFD
Software

#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <ctype.h>

char about_msg[] =
"Text File Converter for Win32\n"
"Copyright (c) 1999, 2000 by Alex Fogol, AFD
Software\n";

char help_msg[] =
"Type: conv32 <win/dos> <infile>
<outfile>\n";

char badfile_msg[] =
"Files error ...\n";

char doscode[] =
"ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ   "
"йцукенгшщзхъфывапролджэячсмитьбюё   ";

char wincode[] =
"ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮикп "
"щ уъхэу  ч ъ ытряЁюыфцэя ёьштьсюё   ";

int codecount = sizeof(doscode)/sizeof(char);

int main(int argc, char* argv[])
{
        register int i;
        static char ch;
        static ifstream infile;
        static ofstream outfile;

        cout<<about_msg;

        if(argc<2)
                cout<<help_msg;
        else
        {
                static int len = strlen(argv[1]);
                for(i=0; i<len; i++) argv[1][i] =
tolower(argv[1][i]);
                if(!strcmp(argv[1],"win"))
                {
                // convert DOS-WIN
                infile.open(argv[2], ios::in);
                if(infile.bad())
                {
                        cout<<badfile_msg;
                        return 1;
                }

                if(argc>2)
                        outfile.open(argv[3],
ios::out);
                else
                        outfile.open(argv[2],
ios::out);

                for(ch = infile.get(); !infile.eof();
ch = infile.get())
                {
                        for(i=0; i<codecount; i++)
                                if(ch==doscode[i])
break;
                        if(i<codecount)
                               
outfile<<wincode[i];
                        else
                                outfile<<ch;
                }

                infile.close();
                outfile.close();
        }
        else if(!strcmp(argv[1],"dos"))
        {
                // convert WIN-DOS
                infile.open(argv[2], ios::in);
                if(infile.bad())
                {
                        cout<<badfile_msg;
                        return 1;
                }

                if(argc>2)
                        outfile.open(argv[3],
ios::out);
                else
                        outfile.open(argv[2],
ios::out);

                for(ch = infile.get(); !infile.eof();
ch = infile.get())
                {
                        for(i=0; i<codecount; i++)
                                if(ch==wincode[i])
break;
                        if(i<codecount)
                               
outfile<<doscode[i];
                        else
                                outfile<<ch;
                }

                infile.close();
                outfile.close();
        }
        else
                cout<<help_msg;
        }
        return 0;
}

Может алгоритм работы и не отличается особым изяществом, но программа успешно работает. Причем первая версия была компилирована в Borland C++ 3.1. Эта версия обладала некоторым недостатком - она не работала с длинными именами Win32 (MS Windows 95/98/2000/NT). Но совершенно очевидно было, что лишь откомпилировав ее для работы в Win32 я получу работающую программу без каких-либо переделок исходного кода. Что я и сделал, перейдя на MS Visual C++. Новая программа получила наименование conv32.exe. Программа все также работает. Более того, я совершенно уверен, что будучи откомпилированной в Unix, моя программа будет работать. Возможно, придется добавить еще один вид кодировки.

Да, в первую очередь я программист. И к решению многих поблем подхожу именно в таком направлении. Скорее всего, я изобрел велосипед. Но если он кому-нибудь пригодится, милости прошу... Я выложу на своем сайте обе эти программы в откомпилированном варианте. Это http://k108.ai.kharkov.ua/~faa/test_exe/convert.zip (9107 байт) и http://k108.ai.kharkov.ua/~faa/test_exe/conv32.zip (18147 байт).

Не сомневаюсь, что многие давно не пользовались командной строкой. Поверьте, часто это удобнее и, несомненно, производительнее. Но если кто-нибудь пожелает иметь графический интерфейс, расширить возможности програмы или как-либо ее усовершенствовать - пишите мне на alex_fogol@mail.ru - я обязательно отвечу и сделаю все, что вы пожелаете. А если вы сами хоть немного программист, берите мой код и совершенствуйте его как хотите.

P.S. Эту заметку я пишу, пользуясь редактором Borland C++ 3.1 для DOS. Неохота мне ждать до завтра и терять зря время. В то время, как машина типа i386DX40 с 8 мегабайтами памяти прекрасно справляется с вводом текста. Да! Есть еще такие!

 


Copyright © 2000г. "Internet Zone" & Nik Romanov, info@izcity.com
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/. При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас.