Кодировщик текста из ср1251 в koi8-р - C (СИ)

Узнай цену своей работы

Формулировка задачи:

ситуация такая, есть 2 файла, один пустой, другой нет. не пустой файл имеет кодировку ср1251. программа должна переписать текст из этого файла в пустой файл, но с кодировкой кои8-р. код написал, но текст выдает некорректно, всегда выдает символы "аааааа". разницы кодов символов проверял, ошибка в другом. помогите)
#include <stdio.h>
#include <string.h>

char function(char s)
{
if (s<128)//стандартные
{
s=s;
}
else
{if(s=254)//ю
s-=62;
else if (((s=224)||(s=225))||((s>=232)&&(s<=239)))//а б и й к л м н о п
s-=31;
else if (s=246)//ц
s-=51;
else if ((s=228)||(s=229))//д е
s-=32;
else if ((s=244)||(s=255))//ф я
s-=46;
else if (s=227)//г
s-=28;
if (s=184)//ё
s-=21;
else if (s=245)//х
s-=45;
else if(s=255)//я
s-=46;
else if ((s>=240)&&(s<=243))//р с т у
s-=30;
else if (s=230)//ж
s-=16;
else if (s=226)//в
s-=11;
else if (s=252)//ь
s-=36;
else if (s=251)//ы
s-=34;
else if (s=231)//з
s-=13;
else if (s=248)//ш
s-=29;
else if (s=253)//э
s-=33;
else if (s=249)//щ
s-=28;
else if (s=247)//ч
s-=25;
else if (s=250)//ъ
s-=27;
}
//заглавные
if (s=222)//Ю
s+=2;
else
{
if ((s=192)||(s=193)||((s>=200)&&(s<=207)))//А Б И Й К Л М Н О П
s+=33;
else if(s=214)//Ц
s+=13;
else if ((s=196)||(s=197))//Д Е
s+=32;
else if (s=212)//Ф
s+=18;
else if (s=195)//Г
s+=36;
else if(s=213)//Х
s+=19;
else if(s=223)//Я
s+=18;
else if ((s>=208)&&(s<=211))//Р С Т У
s+=34;
else if(s=198)//Ж
s+=48;
else if(s=194)//В
s+=53;
else if(s=220)//Ь
s+=28;
else if(s=219)//Ы
s+=30;
else if(s=199)//З
s+=51;
else if(s=216)//Ш
s+=35;
else if (s=221)//Э
s+=31;
else if (s=217)//Щ
s+=36;
else if (s=215)//Ч
s+=39;
else if (s=218)//Ъ
s+=37;
else if (s=168)//Ё
s+=11;
}
return s;
}
char main()
{
FILE *f1=fopen("f1.txt","r"), *f2=fopen("f2.txt","a");
char i, n;
if (f1!=NULL)
  {
  while (!feof(f1))
    {
    i=fgetc(f1);
    n=function(i);
    fputc (n, f2);
    }
  fclose (f1);
  fclose (f2);
  }else
    {
    return -1;
    }
}

Решение задачи: «Кодировщик текста из ср1251 в koi8-р»

textual
Листинг программы
bool xMMF::OpenReadOnly(const char* const pszFileName)
{
   if (_bOpen)
   {
      Close();
   }
 
   // Open File
   errno = 0;  // Preset !
 
   _iFD = open(pszFileName,O_RDONLY | O_SYNC,S_IRWXG);
 
   if (_iFD == -1)
   {
      // Error !
      DESCRIBE_ERROR(errno);
      return false;
   }
 
   // Trick !!
   // Get File Size
   _iSize = lseek(_iFD,0,SEEK_END);
 
   if (_iSize == -1)
   {
      // Error !
      return false;
   }
 
   // Create View
   _pView = mmap(NULL,_iSize,PROT_READ,MAP_SHARED,_iFD,0);
 
   if (_pView == MAP_FAILED)
   {
      // Error !
      return false;
   }
 
   _bReadOnly = true;
 
   _bOpen = true;
   return _bOpen;
}

Объяснение кода листинга программы

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

  1. Если файл уже открыт, функция закрывает его.
  2. Функция открывает файл, используя указанный в параметрах путь. Открытие происходит в режиме только для чтения (O_RDONLY | O_SYNC) и с правами доступа S_IRWXG.
  3. Если открытие файла не удалось, функция закрывает его и возвращает false.
  4. Функция получает размер файла, используя функцию lseek и смещение в 0.
  5. Если получение размера файла не удалось, функция закрывает его и возвращает false.
  6. Функция создает отображение файла в память с использованием функции mmap.
  7. Если отображение файла в память не удалось, функция закрывает его и возвращает false.
  8. Функция устанавливает флаг _bReadOnly в true.
  9. Функция устанавливает флаг _bOpen в true.
  10. Функция возвращает true.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы