Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > "Переделывание" букв в что-то другое


Автор: mr.Anderson 9.3.2006, 20:33
Помогите пожалуйста! Никак в толк не возьму, в чем дело! Пишу следующее:
Код

if(s=='я') fprintf(nfile,"%s","ya");


Можете себе представить, не работает! Между прочим, вот такая строчка:
Код

if(s=='ю') fprintf(nfile,"%s","yu");


Работает! Что за дела! Помогите плиз исправить!

Автор: sergejzr 9.3.2006, 20:41
Давай больше кода. Что такое s? И как "не работает"? не пишется, не реагирует. Как?

Автор: The Thing 9.3.2006, 20:43
Вот не помню точно.. но через принтф у меня была такая же байда..какая именно не помню, но именно буква я там выступала в роле чего-то другого.

Короче напиши отлавливает она 'я' или нет? (помоему с этимм проблема была.) пиши код буквы 'я'ВСЕ!

Автор: mr.Anderson 9.3.2006, 20:56
sergej.z, s - символьная переменная (тип char). Не работает - в смысле в целевом файле нужная комбинация ya не появляется.

Автор: mr.Anderson 9.3.2006, 21:43
Пробовал вот такое сделать:
Так. Попробовал как вариант вписать код буквы Я.
Код

if(s=='\xFF') fprintf(nfile,"%s","ya");

Т.е. вписать вместо "я" ее код. Бесполезняк.

Автор: mr.Anderson 9.3.2006, 22:14
Если это важно. ОС: WinXP. Компилер: Borland C++ Builder 6.0.

Код (это все, что относится к моему вопросу!):
Код

void func(void);
//---------------------------//

void main(void)
{
 func();
}
//---------------------------//

void func(void)
{
 FILE *file;
 file=fopen("nt.txt","w");
 char s;
 while((s=getc(file))!=EOF)
  if(s=='я') fprintf(file,"%s","ya");

 fclose(file);
}

Автор: nikitao 9.3.2006, 22:16
sim7, а заглавная 'я' работает?

Автор: mr.Anderson 9.3.2006, 22:22
nikitao, нет.

Автор: Бонифаций 10.3.2006, 00:43
постойте ка, вы куда пишете? Неужели в тот же файл из которого читаете ?? smile

Автор: maxim1000 10.3.2006, 02:09
Цитата(sim7 @ 9.3.2006, 21:14 Найти цитируемый пост)
while((s=getc(file))!=EOF)
  if(s=='я') fprintf(file,"%s","ya");

код буквы char('я')=-1 (т.к. по умолчанию char считается знаковым)
EOF тоже равен -1
вот и получается, что буква 'я' путается с признаком конца файла
выход такой:
сначала присвоить результат getc какой-нибудь целой переменной
потом проверить на равенство -1
а потом - присвоить s...

Автор: shad0w 10.3.2006, 03:06
undigned char s;

Автор: mr.Anderson 10.3.2006, 17:15
Бонифаций, нет, читается из одного, пишется в другой. Я не настолько глуп, чтобы понять, что с одним и тем же файлом эти две операции выполнять нельзя. smile

shad0w, не работает.

maxim1000, попробую.

Автор: mr.Anderson 10.3.2006, 17:42
Не сработало.
Вот такое для интереса написал:
Код

void main(void)
{
 FILE *file;
 file=fopen("nt.txt","w");
 fclose(file);
 
 file=fopen("nt.txt","rb");
 int s;
 while(!feof(file))
 {
  s=fgetc(file);
  if(s==EOF) break;
  if(s==(unsigned char)'я') printf("Yes!");
  else printf("No!");
 }
 fclose(file);
 getch();
}

Не работает. Не появляется в консольном окошке ни YES, ни NO.
Добавлено @ 17:49
Немного подправил код. Вот так:
Код

void main(void)
{
 FILE *file;
 file=fopen("nt.txt","w");
 fclose(file);
 
 file=fopen("nt.txt","rb");
 int s;
 while(!feof(file))
 {
  s=fgetc(file);
//  if(s==EOF) break; <---- Вот эту строчку убрал
  if(s==(unsigned char)'я') printf("Yes!");
  else printf("No!");
 }
 fclose(file);
 getch();
}

Сработало. Вот только в консольном окошке появилось NO. Хотя в файле, который код роет, написана буковка Я.

Автор: Darhazer 10.3.2006, 17:50
Попробуйте так:
Код

void main(void)
{
 FILE *file;
 file=fopen("nt.txt","w");
 fclose(file);
 
 file=fopen("nt.txt","rb");
 int s;
 while(!feof(file))
 {
  s=fgetc(file);
  //if(s==EOF) break;
  if(s=='я') printf("Yes!");
  else printf("No!");
 }
 fclose(file);
 getch();
}

У вас же уже есть проверка на feof, и она работаеть с 0, а не с -1, зачем вам проверят и s на eof, если знаете, что eof == 'я'

P.S. NO появилось, потому что проверяете на (unsigned char) 'я', а s - signed char

Автор: mr.Anderson 10.3.2006, 17:59
Darhazer, от меня плюс в репутацию. Большое спасибо!
Добавлено @ 17:59
Всем, кто отвечал, тоже спасибо за старание. Вопрос решен.

Автор: mr.Anderson 10.3.2006, 21:09
Стоп-с! Рановато я обрадовался. Появилась еще более серьезная проблема.
Буква "я"-то заработала. Да вот только теперь она стала дописываться в конец всего текста. Вроде, решение понятно: просто "отрезать" два последних символа ("ya") из текста. И вывести отредактированный. Да вот только не получилось так. Почему-то иногда "я" писалась, а иногда нет! И чаще получалось так, что у меня обрезались нужные символы. Скажем, писал
"папа", а вместо "papa" получал "pap". Долго бился, но ничего не вышло.

P.S. Знаю, знаю, чего вы потребуете. Больше кода! Как "оживлю" программу, выложу код. Через день-два.

Автор: maxim1000 10.3.2006, 21:48
Код

 while(true)
 {
  s=fgetc(file);
  if(s==EOF) break;
  if((char)s=='я') printf("Yes!");
  else printf("No!");
 }

лучше привести s при сравнении с 'я'...
Добавлено @ 21:50
Цитата(sim7 @ 10.3.2006, 20:09 Найти цитируемый пост)
Да вот только теперь она стала дописываться в конец всего текста

а это уже вполне точно указывает на то, что конец файла принимается за я
странно только, почемон все-таки выходит...
Добавлено @ 21:54
а... все smile

Цитата(sim7 @ 10.3.2006, 16:42 Найти цитируемый пост)
while(!feof(file))
while(!feof(file))
{
  s=fgetc(file);
  if(s==EOF) break;
  if(s==(unsigned char)'я') printf("Yes!");
  else printf("No!");
}

по if(s==EOF) break; оно выходить не может, иначе вышло бы до printf("Yes!")
значит, оно выходит из-за !feof(file)
а это значит, что последний "несуществующий" символ конца файла читается, а уже после этого устанавливается feof
а это, в свою очередь, значит, что проверять на конец файла нужно ПОСЛЕ чтения...
Код

while(true)
 {
  s=fgetc(file);
  if(feof(file))
    break;
  if(s==(unsigned char)'я') printf("Yes!");
  else printf("No!");
 }

Автор: Dov 10.3.2006, 22:21
Попробуй do - while
Код

 do
 {
     s = getc(file);
     if(s == 'я')
         printf("%s","ya");

 }while (s != EOF);

то есть сначала присваивай (s = getc(file)) и печатай (printf("%s","ya")), а потом проверяй (while (s != EOF) )

Автор: Dov 11.3.2006, 00:13
Так, пожалуй, будет лучше
Код

int s;

do
{
    s = fgetc(file);
    if(s == (unsigned char)'я')
    {// здесь вывод на экран
        printf("%s\n","ya");
        s = fgetc(file);
    }
    // это просто для проверки
    //else
    //    printf("%s\n","no");

}while(s != EOF);

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