|
||
|
||
Как изменить формат текстового документа |
||
Алексей Фоголь При всем моем уважении к автору статьи, опубликованной в 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/. При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас. |