Кодировщик текста из ср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;
}
Объяснение кода листинга программы
В данном коде представлена функция, которая открывает файл в режиме только для чтения. Вот список действий, которые она выполняет:
- Если файл уже открыт, функция закрывает его.
- Функция открывает файл, используя указанный в параметрах путь. Открытие происходит в режиме только для чтения (O_RDONLY | O_SYNC) и с правами доступа S_IRWXG.
- Если открытие файла не удалось, функция закрывает его и возвращает false.
- Функция получает размер файла, используя функцию lseek и смещение в 0.
- Если получение размера файла не удалось, функция закрывает его и возвращает false.
- Функция создает отображение файла в память с использованием функции mmap.
- Если отображение файла в память не удалось, функция закрывает его и возвращает false.
- Функция устанавливает флаг _bReadOnly в true.
- Функция устанавливает флаг _bOpen в true.
- Функция возвращает true.