Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Memo1->Lines и переменные


Автор: mr.Anderson 2.8.2005, 16:16
Задача такая: нужно найти в тексте, написанном в объекте TMemo с именем Memo1, все русские буквы и преобразовать их в цифры, равные порядковому номеру буквы в алфавите.
Я пробовал код:
Код

char str[]=Memo1->Lines.ToString();

А потом перебор через цикл for:
Код

int i=0;
for(i=0;i<=(strlen(str)-1);i++)
{
  if(str[i]=="в") str[i]="3";
}

Однако, выдается ошибка даже в первом фрагменте кода. Пишет вот это:
Цитата
[C++ Error] Unit1.cpp(23): E2294 Structure required on left side of . or .*

Я даже не знаю, что делать. Подскажите, как решить эту задачку?

P.S. Только желательно с объяснением каждой строчки кода, т.к. я еще начинающий.

Автор: Void 2.8.2005, 21:01
sim7
Ругается потому, что свойство Lines объекта TMemo возвращает указатель на TStrings. А метод у указателя на объект вызывается через "->", а не через ".". Впрочем, метода ToString у класса TStrings я тоже не заметил...
Дальше. Если допустить, что в str все-таки попала строка, то на такое сравнение:
str[i] = "в"
компилятор будет сильно ругаться, потому что слева char, а справа char*. Символы в Си заключаются в одинарные кавычки. Присваивание str[i] = "3" неверно по той же причине.

Код раскритиковал, а рабочий не приведу smile Потому что совершенно забыл, как работают операции над строками в билдере smile

Автор: codelord 2.8.2005, 21:02
Для примера забей в мемо
такой текст
Цитата

ё1234567890-=йцукенгшщзхъ\фывапролджэячсмитьбю.Ё!"№;%:?*()_+ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ


и вот где-то таким кодом получи код каждого символа в Memo
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int lines;
int string=0;
int digit;
for(lines=0;lines<Memo1->Lines->Count;lines++)
        {
        for(string=1;string<=Memo1->Lines->operator [](lines).Length();string++)
                {
                digit=Memo1->Lines->operator [](lines)[string];
                ListBox1->Items->Add(IntToStr(digit));
                }
        }
}
// Только не надо меня бить палками это пример :)

для этого на форме д.б. ListBox и Memo.

и
в том месте где проверка digit
вставляй свои if

хотя я бы советовал сохранять в файл, и там уже проводить свои операции
будет быстрее в десятки раз.




Автор: mr.Anderson 3.8.2005, 05:37
Спасибо, попробую.

Автор: mr.Anderson 3.8.2005, 05:59
Не-а... smile Ругается на 8 строчку в вашем коде. Пишет:
Цитата
[C++ Error] Unit1.cpp(26) E2316 'operator[]' is a not a member of 'TStrings'

Что скажете?

Да, а как с файлом сделать?

Автор: mr.Anderson 3.8.2005, 13:19
Вот, решил сделать с файлами, как советовали.
Написал вот это:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2=new TForm2(this);
if(Form2->ShowModal()==mrCancel) return;
Form2->TextToCode->Lines->SaveToFile("data.txt"); //TextToCode - это новое имя Memo1
if(operationfile()!=0) MessageBox(NULL,"Все прошло успешно!","Сообщение",MB_OK|MB_ICONEXCLAMATION);
if(operationfile()==0) MessageBox(NULL,"Не было выполнено ни одного преобразования!","Сообщение",MB_OK|MB_ICONEXCLAMATION);
}

Это код в событии OnClick кнопки Button1.
А теперь надо в этом файле заменить все русские буквы на их порядковый номер, а затем переписать файл, записав в него измененный текст.
Но я никак не могу понять, как это сделать. Может, поможете? Я начал вот так:
Код

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
int operationfile(void)
{
FILE *fp;
if((fp=fopen("coder.txt","a+"))==NULL) return 0;
//Вот тут надо с файлом поработать, но как?
fclose(fp);
if(h!=0) return 1;
else return 0;
}

Что подскажете?

Автор: codelord 3.8.2005, 13:41
Цитата(sim7 @ 3.8.2005, 05:59)
Что скажете?

Видимо билдер у тебя не шестой, у меня идет, но не страшно, способ всеравно тормозной smile



Цитата(sim7 @ 3.8.2005, 05:59)
Да, а как с файлом сделать?


Для примера если вствишь скажем в обработчик кнопки вот такой код.... в Мемо должен быть какой нибудь текст.
Код

Memo1->Lines->SaveToFile("c:\\test.txt");
FILE *in, *out;
in=fopen("c:\\test.txt","rb");
out=fopen("c:\\new.txt","wb");
//int i=0;
int c=0;
while ((c=getc(in))!=EOF)
        {
        fprintf(out,"%c,%d \n",c,c);
        }
fclose(in);
fclose(out);

то в соответствующем new.txt, ты увидишь буквы находящиеся в твоем мемо
и коды соответственно им,
для того чтобы печатать просто цифры,
можно оставить

fprintf(out,"%d \n",c);

но пока это будут только таблица кодов,
для того чтобы тебе печатать твои, и нужны проверки перед выводом в файл, т.е. до fprintf.
например
if(c==223) c=33; //для 'Я' это в общем смотря какой ты хочешь дать код каждой букве?
есть таблица кодов, так тебе будет легче реализовать твою идею.
но можешь, с помощью примера выше сам определять код каждой буквы.
Ну надеюсь понял, т.е. 223 это буква Я согласно таблице кодов wind1251. а ты ей даешь 33(свой).
если таблицы кодов нет, возьми выше я давал, стандартный набор забей в мемо и этим обработчиком ты его получишь. Успехов.

Автор: Vyacheslav 3.8.2005, 13:51
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString text = Memo1->Lines->Text;
    for (char i = 'а'; i <= 'я'; i++) {
          text = AnsiReplaceText(text, AnsiString(i), AnsiString(int(i-'а')));
    }
    Memo1->Lines->Text = text;
}

Автор: codelord 3.8.2005, 15:27
Vyacheslav , я не критикую,
но попробуйте в свое мемо загрузить текст скажем в килобайт хотябы 500-600,.....
у себя я так и не дождался.

Автор: Vyacheslav 3.8.2005, 16:10
Вы название темы видели?

Автор: mr.Anderson 3.8.2005, 16:53
codelord, хм... С двумя файлами? Я как-то и не догадался... Сейчас буду пробовать.
Билдер у меня действительно не шестой. Пятая версия. Да они не особо отличаются, я думаю...
Vyacheslav, ваш код тоже попробую, но только для того, чтобы в нем попытаться разобраться (что у меня вряд ли получится - можете свой код прокомментировать построчно?), постольку поскольку тормозная прога мне не нужна. Про название темы вы правы, но название о чем-либо не значит, что отвечающие должны давать код только для решения проблемы. Предлагаемый вами код должен быть еще и полезным, а не только "самым худшим вариантом из того, что я знаю". smile smile
В общем, сейчас пойду пробовать. Что получится, напишу.
Добавлено @ 17:02
Всегда меня кто-то опережает в ответе, да что такое. smile
codelord, мне нужно обрабатывать именно большие объемы текста. Поскольку реальная задача у меня вовсе не "перевод букв в цифры", а немного другая...

Автор: codelord 3.8.2005, 16:53
Видел smile , там вроде "можно предлагать тормозные способы" не написано.

шучу. smile

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


Автор: Vyacheslav 3.8.2005, 17:04
Комментировать пять строчек? Ну Вы даете.

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // получаем содержимое Memo  в виде AnsiString
    // в принципе  здесь в text можно элементарно загрузить содержимое из файла 
    
    AnsiString text = Memo1->Lines->Text;
   
    // меняем в тексте все 'а' на 'a' - 'a' = 0
    // меняем в тексте все 'б' на  'б' - 'а' = 1
    // ...
    // меняем в тексте все 'я' на 'я' - 'а' = ...
    for (char i = 'а'; i <= 'я'; i++) {
          text = AnsiReplaceText(text, AnsiString(i), AnsiString(int(i-'а')));
    }
    // заменяем содержимое Memo модифицированным текстом
    Memo1->Lines->Text = text;
}






Добавлено @ 17:11
Насчет худшего варианта: я решил задачу в четыре строчки. Причем количество строчек не увеличится , если загрузку сделать из файла минуя Memo. Я не знаю, какие у Вас машины, но лаконичность кода одно из немаловажных факторов. Кстати, о птичках, другого реально работающего кода я здесь не вижу

Автор: mr.Anderson 3.8.2005, 17:30
Ладно, проверю ваш код... Но сначала перепробую все остальное. smile
Написал вот такой код (по аналогии с кодом codelord'a):
Код

void operationfile(void)
{
FILE *in,*out;
if((in=fopen("oldtext.txt","r"))==NULL) MessageBox(NULL,"Ошибка открытия файла!","Сообщение",MB_ICONEXCLAMATION);
if((out=fopen("newtext.txt","w+"))==NULL) MessageBox(NULL,"Ошибка открытия второго файла!","Сообщение",MB_ICONEXCLAMATION);
int h=0;
char c;
while ((c=getc(in))!=EOF)
{
 if(c=='а') {c='1';fprintf(out,"%s",c);h++;}
 if(c=='3') {c='в';fprintf(out,"%s",c);h++;}
 if(c=='s') {c='20';fprintf(out,"%s",c);h++;}
}
fclose(in);
fclose(out);
if(h==0) MessageBox(NULL,"Не было преобразований!","Сообщение",MB_ICONEXCLAMATION);
}

codelord, я у вас одной вещи не понял. Почему у вас переменная c, которой присваиваются символы, объявлена как int? В своем скрипте я это исправил, может, зря?
Проблема: у меня вообще не создается файл с новым текстом, несмотря на способ открытия "w+" (он подразумевает создание для чтения и записи). Просто не создается, и все. И никаких действий, разумеется, программа с ним не делает. Однако, и предупреждений не выдает... В чем ошибка?

Автор: codelord 3.8.2005, 17:57
Цитата(sim7 @ 3.8.2005, 17:30)
сodelord, я у вас одной вещи не понял. Почему у вас переменная c, которой присваиваются символы, объявлена как int?
я это сделал вместо компилятора, он это все равно делает сам.

Код

if(c=='s') {c='20';fprintf(out,"%s",c);h++;}

так писать нельзя, во первых что такое с='20'
с-это у тебя char а '20' это неизвестно что,
если ты хотел приравнять к 20 то так и пиши c=20,
а если ты хотел приравнять к строке "20", то это невозможно она в него не влезет.

второе fprintf(out,"%s",c) невозоможно потому как
c - у тебя символ поэтому надо писать %c. а не %s.
поэтому учитывая вышесказанное приводим твой код:

Код

void operationfile(void)    
{
FILE *in,*out;
if((in=fopen("oldtext.txt","rb"))==NULL) MessageBox(NULL,"Ошибка открытия файла!","Сообщение",MB_ICONEXCLAMATION);
if((out=fopen("newtext.txt","w+"))==NULL) MessageBox(NULL,"Ошибка открытия второго файла!","Сообщение",MB_ICONEXCLAMATION);
int h=0;
int c;
while ((c=getc(in))!=EOF)
{
 if(c=='а') {c='1';fprintf(out,"%c",c);h++;}
 if(c=='3') {c='в';fprintf(out,"%c",c);h++;}
 if(c=='s') {c=20 ;fprintf(out,"%c",c);h++;}
}
fclose(in);
fclose(out);
if(h==0) MessageBox(NULL,"Не было преобразований!","Сообщение",MB_ICONEXCLAMATION);
}

извиняюсь за каракули.

Автор: Vyacheslav 3.8.2005, 18:01
Не угадал. С фаловым чтением-записью на три строчки все же поболее вышло

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    std::auto_ptr<TMemoryStream> stream(new TMemoryStream());
    stream->LoadFromFile( "oldtext.txt");
    AnsiString text((char*)stream->Memory, stream->Size); 
    for (char i = 'а'; i <= 'я'; i++) {
          text = AnsiReplaceText(text, AnsiString(i), AnsiString(int(i-'а')));
    }
    stream->Write(text.c_str(), text.Length());
    stream->SaveToFile("newtext.txt");
  
}


Автор: mr.Anderson 3.8.2005, 18:08
codelord, я уже говорил об этом. У меня просто не создается файл newtext.txt! Почему он не создается? И c вашим кодом тоже не создается!

Автор: codelord 3.8.2005, 18:47
sim7, мне трудно ответить на твой вопрос, у меня все создается. Могу лишь посоветовать
указать точное место файла например "c:\\newtext.txt", у меня как-то было такое, что программа создавала файлы не в своем каталоге.

Автор: mr.Anderson 3.8.2005, 19:31
Да что такое! Не могу понять! Код-то верный, чего этому компайлеру еще надо!
codelord, посмотрите, может, я чего не так списал:
Код

void operationfile(void)    
{
FILE *in,*out;
if((in=fopen("oldtext.txt","r"))==NULL) MessageBox(NULL,"Ошибка открытия файла!","Сообщение",MB_ICONEXCLAMATION);
if((out=fopen("newtext.txt","w+"))==NULL) MessageBox(NULL,"Ошибка открытия второго файла!","Сообщение",MB_ICONEXCLAMATION);
int h=0;
int c;
while ((c=getc(in))!=EOF)
{
 if(c=='а') {c='1';fprintf(out,"%c",c);h++;}
 if(c=='3') {c='в';fprintf(out,"%c",c);h++;}
 if(c=='s') {c=20 ;fprintf(out,"%c",c);h++;}
}
fclose(in);
fclose(out);
if(h==0) MessageBox(NULL,"Не было преобразований!","Сообщение",MB_ICONEXCLAMATION);
}

Явное указание пути, по вашему совету, ни к чему не приводит. Файл упорно не создается.
Но, что самое интересное, даже если я вручную создам этот файл (до запуска программы), а способ открытия сменю на "w", с файлом все равно ничего не происходит! То есть, никаких изменений в него не записывается, и нового текста там тоже нет! Прога просто его "не видит"! Что за напасть?!

Автор: codelord 3.8.2005, 19:43
sim7 А первый мой вариант с файлами работает?

Автор: mr.Anderson 3.8.2005, 20:16
Нет, второй файл упорно не создается...
Может, какой файл заголовочный надо подключить? Может, просто функции вызова файла не работают?

Автор: mr.Anderson 3.8.2005, 20:40
Ой, не могу! smile smile smile Нет, это ж надо так осрамиться! Нашел причину "не работы" программы. Вам интересно узнать, какая была причина? Кошмар! Даже сознаваться стыдно - столько возни - и из-за чего!
А суть была вот в чем: функцию работы с файлом я написал (кстати, вот еще раз ее код):
Код

void operationfile(void)
{
FILE *in,*out;
in=fopen("oldtext.txt","r");
out=fopen("newtext.txt","w+");
int c=0,h=0;
while ((c=getc(in))!=EOF)
{
 if(c=='а') {c='1';fprintf(out,"%c",c);h++;}
 if(c=='3') {c='#';fprintf(out,"%c",c);h++;}
 if(c=='s') {c='2';fprintf(out,"%c",c);h++;}
}
fclose(in);
fclose(out);
if(h==0) MessageBox(NULL,"Не было преобразований!","Ошибка",MB_ICONEXCLAMATION);
}

Ну, функцию-то написал. А вызвать ее забыл! smile
Но проблема работы с файлом остается актуальной. Вместо преобразованного текста в новом файле отображаются только квадратики... По крайней мере, через просмотр "Блокнотом". В принципе, и через Word, скорее всего, то ж самое будет.
Почему это может быть? Может, из-за присутствия русских букв? Но мне крайне надо, чтобы русские буквы были преобразованы...
Добавлено @ 20:44
Да, сейчас только что проверил - русские буквы не преобразовываются. В Word они просто не отображаются (т.е. они преобразованы, но их не видно...), а в Блокноте квадратики вместо символов. Как сделать, чтобы прога понимала кириллицу? Я так понимаю, надо локаль настроить, но как? Я о понятии "локаль" знаю из PHP, а в С++ я с ней вообще никогда не сталкивался.
Прошу помочь!

Автор: codelord 3.8.2005, 22:53
Ладно написал сам, в общем как я понял тебе вместо русских букв нужны
их порядковые номера в русском алфавите, только вот про большие и маленькие буквы ты ничего не сказал,
ниже код, делает, то, что тебе надо, причем специально я сдал так, что на большую и маленькую букву будет показываться одна и таже цифра т.е а или А будет 1., сделал символы через зяпятую иначе, не видно смысла.
Код

FILE *in, *out;
in=fopen("c:\\test.txt","rb");
out=fopen("c:\\new.txt","wb");
int c=0;
while ((c=getc(in))!=EOF)
        {
        if(c>=192 && c<= 197) {c-=191; fprintf(out,"%d,",c); continue; }
        else if(c>=198 && c<= 223) {c-=190; fprintf(out,"%d,",c); continue; }
        else if(c>=224 && c<= 229) {c-=223; fprintf(out,"%d,",c); continue; }
        else if(c>=230 && c<= 255) {c-=222; fprintf(out,"%d,",c); continue; }
        else if(c==184) {c=7; fprintf(out,"%d,",c); continue;}
        else if(c==168) {c=7; fprintf(out,"%d,",c); continue;}
        else putc(c,out);
        }
fclose(in);
fclose(out);

кодировка win1251.
проверки на NULL думаю сам добавишь.

Автор: codelord 3.8.2005, 23:03
Vyacheslav Ради интереса сравни быстродействие со своим кодом.

Автор: mr.Anderson 4.8.2005, 10:11
codelord, а по какому принципу вы все это делали? smile Какие-то циферки... И потом, у вас ведь не весь алфавит русский сделан, как мне доделать? В общем, расскажите, что вы в коде вашем делали, чтобы я мог продолжить САМ.

Автор: codelord 4.8.2005, 10:24


Добавлено @ 10:29
sim7, что из русского алфавита тебе еще нужно?. Не понял почему не весь. там должно быть ровненько 66
букв. smile.
А по какому принципу, советую перечитать предыдущие посты, я раньше это уже объяснял, с буквой Я.
это сделано согласно кодировке win1251. Что именно не понятно?.

Автор: codelord 4.8.2005, 10:49
Ладно давай еще разок,
есть строка
Код

if(c>=192 && c<= 197) {c-=191; fprintf(out,"%d,",c); continue; }

в ней компилятору объясняется если
с>=192(код буквы А) и c<=197(код буквы Е) то вычитаем 191 получаем соответственно 1,2,3,4,5,6 буквы.
дальше в кодировке идет не Ё а Ж поэтому дальше уже вычитаем 190.
т.е
а Ё проверим отдельно в строке
Код

else if(c==168) {c=7; fprintf(out,"%d,",c); continue;}

а дальше то же самое делаем с маленькими буквами.

смотри прикрепленный файл, это соответствие кодов, русским др. символам, думаю все поймешь.

Автор: Vyacheslav 4.8.2005, 11:17
Код

std::ifstream inp("oldtext.txt");
std::ofstream out("newtext.txt");
for (;!inp.eof();) {
        unsigned char c;
        inp >> c;
        out << c - (( c >= 192 && c <= 255 )? (192):('/0')) << ',';
}

Добавлено @ 11:19
Цитата(codelord @ 3.8.2005, 23:03)
Vyacheslav Ради интереса сравни быстродействие со своим кодом.

Ну что будем по быстродействию и по лаконичности сравнивать?

Автор: mr.Anderson 4.8.2005, 11:39
Для меня бы лучше по быстродействию. smile А для вас - не знаю, сами решайте.
Добавлено @ 11:44
codelord, ваш файл не скачивается. Ни браузером, ни флэшгетом. Вместо него качается "index.php", в котором ничегошеньки нетуть...

Автор: codelord 4.8.2005, 11:51
Цитата(Vyacheslav @ 4.8.2005, 11:17)
Ну что будем по быстродействию и по лаконичности сравнивать?

будем smile, сравнение я беру на себя если хочешь, но
ваш последний код будет работать не правильно, где ваши буквы ё,Ё ?.
и поэтой причине порядок будет нарушен т.е Ж=8 а у вас она скорей всего будет 6.
а с маленькими буквами совсем беда(но тут автор умолчал.).
Добавлено @ 11:52
sim7 попробуй скачачть еще раз. !!!

Автор: Vyacheslav 4.8.2005, 12:11
Вы часто видели последний раз букву Ё ё. А маленкие просто отсчитываются по порядку. Остается отметить, что предложенный Вам к С++ отношения не имеет (это чистый С) smile
А использование continue в блоке if-else выглядит весьма любопытно :масло-масленное

Автор: codelord 4.8.2005, 12:49
Цитата(Vyacheslav @ 4.8.2005, 12:11)
А использование continue в блоке if-else выглядит весьма любопытно :масло-масленное

Ладушки, я решил все-таки протестировать (свой и свой smile )
Каждая функция вызывалась 20 раз.
48:14:927-48:24:821 (9 sec, 894 msec ) с continue
48:24:821-48:35:26 (10 sec 493 msec) без continue

вот и масло-масляное, и это логично.

забыл написать текст размером 572 кб.

Автор: Vyacheslav 4.8.2005, 13:28
Ну все приходится разъяснять smile
Нет смысла использовать одновременно continue и else.
Тогда уж
Код

if (...) { ... continue; }
/*else*/ if (...) { ... continue; }
... 

Автор: mr.Anderson 4.8.2005, 13:37
codelord, файл скачался, только в нем одни квадратики. И Word его тож квадратиками показывает.

Автор: codelord 4.8.2005, 13:42
Vyacheslav интересно чем ты объяснишь бoльшее быстродействие??
на мой взгляд continue отправляет компилятор считывать следующий символ а не заглядвать
- что же идет после блока if-else if. и только после этого отправляться туда, куда я его отправляю раньше.

Чем же объяснишь это ты?
Цитата(Vyacheslav @ 4.8.2005, 13:28)
Нет смысла использовать одновременно continue и else.

опять таки на мой взгляд есть.
Тем не менее хочу услышать ответ, откуда взялось лишее быстродействие?

Добавлено @ 13:47
Цитата(sim7 @ 4.8.2005, 13:37)
codelord, файл скачался, только в нем одни квадратики. И Word его тож квадратиками показывает

там не могут быть одни квадратики, там все сиволы от 0 до 255, какие -то невидимые символы вот
они и квадратики и пустоты, но там еще есть русские буквы и английские буквы и символы и т.д.
ты скролом то вниз поработай smile.
или создай сам вот таким кодом.
Код

FILE *out;
out=fopen("c:\\new.txt","wb");
int c=0;
for(c=0;c<=255;c++)
        {
        fprintf(out,"%c,%d \n",c,c);
        }
fclose(out);

Автор: codelord 4.8.2005, 14:14
Vyacheslav Оказался Вы Оказались Правы smile. по поводу "тогда уж".
конструкция ниже, оказалась на 16% быстрее нежели первый вариант.
Код

FILE *in, *out;
in=fopen("c:\\test.txt","rb");
out=fopen("c:\\new.txt","wb");
int c=0;
while ((c=getc(in))!=EOF)
        {
        if(c>=192 && c<= 197) {c-=191; fprintf(out,"%d,",c); continue; }
        if(c>=198 && c<= 223) {c-=190; fprintf(out,"%d,",c); continue; }
        if(c>=224 && c<= 229) {c-=223; fprintf(out,"%d,",c); continue; }
        if(c>=230 && c<= 255) {c-=222; fprintf(out,"%d,",c); continue; }
        if(c==184) {c=7; fprintf(out,"%d,",c); continue;}
        if(c==168) {c=7; fprintf(out,"%d,",c); continue;}
        putc(c,out);
        }
fclose(in);
fclose(out);

Автор: codelord 4.8.2005, 15:22
Цитата(sim7 @ 4.8.2005, 13:37)
codelord, файл скачался, только в нем одни квадратики. И Word его тож квадратиками показывает.

ты бы нормальными редакторами пользовался smile хотябы
таким.
http://www.astonshell.ru/bred3/

файл я переделал (если тебе он еще нужен )адаптировав его под блокнот:

Автор: codelord 4.8.2005, 19:52
sim7 ты бы ответил ради приличия smile.
У тебя там все нормально?.

Автор: Void 4.8.2005, 21:13
Есть способ определить, является ли буква символом кириллицы и не закладываясь на магические числа и определенную кодировку - с помощью локалей C++.
Код
std::locale ru_loc("russian_Russia");
std::locale c_loc("C");
...
char c;
...
if (std::isalpha(c, ru_loc) && !std::isalpha(c, c_loc)) { // исключаем латинницу
    c = std::tolower(c, ru_loc); // переводим в нижний регистр
    // чего-то делаем с русской буквой
} else {
    // ну нет, так нет...
}

А вот определить однозначно порядковый номер буквы в алфавите так просто уже не получится. Локаль можно использовать как функтор для сравнения строк => следовательно можно отсортировать символы в алфавитном порядке. Однако я проверил на VC 7.1 и оказалось, что в полученное таким образом множество попадают специфические символы с закорючками из славянских алфавитов.

Да, и ни слова про быстродействие! Premature optimization is root of сами_знаете_что smile

Автор: mr.Anderson 5.8.2005, 16:36
codelord, да нет, не все в порядке. В смысле, ваш-то файл в норме, а вот моя прога - нет. smile У меня почему-то "переводятся" в порядковый номер только "выборочные" символы. Например, первую букву во введенном тексте прога переводит всегда, а остальные - большую часть не преобразует... Почему? Код такой же, как и раньше.
void, ого-го, вот это код. smile Я уже запутался, что там написано у вас. smile Постараюсь сейчас разобраться...

Автор: codelord 5.8.2005, 17:40
Цитата(sim7 @ 5.8.2005, 16:36)
Например, первую букву во введенном тексте прога переводит всегда, а остальные - большую часть не преобразует... Почему? Код такой же, как и раньше.



sim7 это как??. Код который я дал все ведь делает!!!. В чем то проблема,
он у тебя работает?. Только что попробовал, ни одной русской буквы в преобразованном тексте я не нашел.
Все ведь уже сделал smile

Автор: codelord 5.8.2005, 17:54
Показывай как ты используешь код.

Автор: mr.Anderson 5.8.2005, 18:19
Один момент. Я его тут случаем стер... smile smile Сейчас восстановлю, а там посмотрим.
Глюки у меня одни с этим кодом. smile

Автор: mr.Anderson 6.8.2005, 18:44
Вот код (ваш):
Код

#include <vcl.h>
#include <stdio.h>
#include <iostream.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
int operationfile(void)
{
FILE *in, *out;
in=fopen("c:\\test.txt","rb");
out=fopen("c:\\new.txt","wb");
int c=0,h=0;
while ((c=getc(in))!=EOF)
        {
        if(c>=192 && c<= 197) {c-=191; fprintf(out,"%d,",c); continue; h++;}
        if(c>=198 && c<= 223) {c-=190; fprintf(out,"%d,",c); continue; h++;}
        if(c>=224 && c<= 229) {c-=223; fprintf(out,"%d,",c); continue; h++;}
        if(c>=230 && c<= 255) {c-=222; fprintf(out,"%d,",c); continue; h++;}
        if(c==184) {c=7; fprintf(out,"%d,",c); continue; h++;}
        if(c==168) {c=7; fprintf(out,"%d,",c); continue; h++;}
        putc(c,out);
        }
fclose(in);
fclose(out);
if(h==0) MessageBox(NULL,"Не было преобразований!","Ошибка",MB_ICONEXCLAMATION);
return h;
}

Пишет ошибку в линии 25.

К слову, раз уж в тексте используется MessageBox, какие значения кроме MB_ICONEXCLAMATION могут быть?

Автор: codelord 6.8.2005, 19:27
Цитата(sim7 @ 6.8.2005, 18:44)
Вот код (ваш):

если ты изменил хотя бы одну строку, так писать нельзя.

кто же так пишет:
Код

if(c>=192 && c<= 197) {c-=191; fprintf(out,"%d,",c); continue; h++;}

h++ никогда не сработает!!!
поэтому поменяй местами continue и h++,

Кстати даже при том, что ты напутал, код у меня текст всеравно преобразует,
только пишет ноль преобразований smile

Цитата(sim7 @ 6.8.2005, 18:44)
К слову, раз уж в тексте используется MessageBox, какие значения кроме MB_ICONEXCLAMATION могут быть?

Цитата

Флаг Значение (в скобках даны надписи в русифицированных версиях Windows)
MB_ABORTRETRYIGNORE Кнопки Abort (Стоп), Retry (Повтор) и Ignore (Пропустить).
MB_OK Кнопка OK. Этот флаг принят по умолчанию.
MB_OKCANCEL Кнопки OK и Cancel (Отмена).
MB_RETRYCANCEL Кнопки Retry (Повтор) и Cancel (Отмена).
MB_YESNO Кнопки Yes (Да) и No (Нет).
MB_YESNOCANCEL Кнопки Yes (Да), No (Нет) и Cancel (Отмена).
21 Флаги пиктограмм в диалоговом окне


Флаг Пиктограмма
MB_ICONEXCLAMATION, MB_ICONWARNING Восклицательный знак (замечание, предупреждение).
MB_ICONINFORMATION, MB_ICONASTERISK Буква i в круге (подтверждение).
MB_ICONQUESTION Знак вопроса (ожидание ответа).
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND Знак креста на красном круге (запрет, ошибка).

на будущее
ошибку тоже надо описывать, я же не Экстрасенс smile

Автор: mr.Anderson 7.8.2005, 11:35
Цитата
если ты изменил хотя бы одну строку, так писать нельзя.

Это я потом подредактировал сообщение, а эту строчку исправить забыл. Ежу ясно, что код не ваш в данном случае. smile
Все равно странно. У меня работает "выборочно". Может, это билдер виноват? Он у меня постоянно какие-то ошибки пишет. То при открытии самого билдера, то при открытии проектов... Когда есть ошибки, когда нет. Глючный, зараза. Может, поэтому проблемы?

Автор: codelord 8.8.2005, 05:08
Цитата(sim7 @ 7.8.2005, 11:35)
Он у меня постоянно какие-то ошибки пишет. То при открытии самого билдера, то при открытии проектов... Когда есть ошибки, когда нет.

раз так конечно поставь шестой, тем более есть повод smile

в подтверждение работоспособности кода цепляю кусочек кникги K&R smile

Это классическая книга по Языку С.аторов Kernighan Brian W. and Ritchie Dennis M.,

Автор: mr.Anderson 8.8.2005, 16:05
Поставил шестой. Но код пока не проверял. Глюков в нем, правда, и впрямь меньше.
А что это за файл, так и не понял? Перевод текста из книги, что ль?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)