Кодировки Карл, как в бинарном dat файле отобразить нормально росийский язык? - C (СИ)

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

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

Код следующий:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include<locale.h>
struct  tov {char name[10]; float c; int kol;} t1;
void input(FILE *); // создание нового файла
void print(FILE *); // просмотр файла
void app(FILE *); // добавление в файл
void find(FILE *); // поиск и изменение 
int main()
{ 
     char c;
    setlocale(LC_ALL, "rus");//system("cpch1251");//setlocale(LC_ALL, "rus");
 
  FILE *tf;
  while (1)
  { system("cls");//clrscr();
    puts("  1 - новый файл");
    puts("  2 - просмотр файла");
    puts("  3 - добавление в файл");
    puts("  4 - поиск и изменение");
    puts("  0 - выход");
    c=getch();
    switch(c)
    { case '1':input(tf);break;
      case '2':print(tf);break;
      case '3':app(tf);break;
      case '4':find(tf);break;
      case '0':return 0;
      default : puts(" неверный режим");
     }
  }
}
void input(FILE *tf)
{system("cpch866");//setlocale(LC_ALL, "rus"); 
char ch;
  tf=fopen("file1.dat","wb"); // открытие бинарного файла для записи
  system("cls");//clrscr();
  printf("\n Ввод товаров\n");
  do
  { printf("\n название: "); scanf("%s",&t1.name);
    printf(" цена: "); scanf("%f",&t1.c);
    printf(" количество: "); scanf("%d",&t1.kol);
    fwrite(&t1,sizeof(t1),1,tf); // запись в файл одной структуры t1
    printf("\n Закончить?  y/n  ");
    ch=getch();
  }
  while (ch != 'y');
  fclose(tf);
}
void print(FILE *tf)
{ setlocale(LC_ALL, "rus");//system("cpch866");
int i;
  system("cls");//clrscr();
  tf=fopen("file1.dat","rb"); // открытие бинарного файла для чтения
  i=1;
  fread(&t1,sizeof(t1),1,tf); // чтение из файла одной структуры t1
  while (!feof(tf))
  { printf("\n  %3d tovar %10s cena %6.2f kolic %4d",i,t1.name,t1.c,t1.kol);
    fread(&t1,sizeof(t1),1,tf);
    i++;
  }
  getch();
}
void app(FILE *tf)
{
//setlocale(LC_ALL, "rus");
system("cpch866");//
 char ch;
  tf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления
  system("cls");//clrscr();
  printf("\n  Ввод товаров \n");
  do
  {  printf("\n название: "); scanf("%s",&t1.name);
    printf(" цена: "); scanf("%f",&t1.c);
    printf(" количество: "); scanf("%d",&t1.kol);
    fwrite(&t1,sizeof(t1),1,tf);
    printf(" Закончить?  y/n ");
    ch=getch();
  }
  while (ch != 'y');
  fclose(tf); 
}
void find(FILE *tf)
{system("cpch866");
 char c,tov[10];
  long int i = 0;
  tf=fopen("file1.dat","rb+"); // открытие бинарного файла для чтения и записи
  system("cls");//clrscr();
  puts(" Название искомого товара: ");
  gets(tov);
  fread(&t1,sizeof(t1),1,tf);
  while (!feof(tf))
  {  if (strcmp(t1.name,tov)==0)
     {   printf(" tovar %10s cena %6.2f kolic %d",t1.name,t1.c,t1.kol);
         printf("\n изменить? y/n ");
         c=getch();
         if (c=='y')
         {  printf("\n количество: ");scanf("%d",&t1.kol);
            printf("\n цена: ");scanf("%f",&t1.c);
            i=sizeof(t1);
            fseek(tf,-i,1); // возврат на sizeof(t1) байт назад
            fwrite(&t1,sizeof(t1),1,tf); // запись изменённой структуры на прежнее место
         }
      }
     fread(&t1,sizeof(t1),1,tf);
  }
  fclose(tf);
}
Задача:"заставить это все работать на росийском. Что только уже ни пробовал не выходит...

Решение задачи: «Кодировки Карл, как в бинарном dat файле отобразить нормально росийский язык?»

textual
Листинг программы
#include <Windows.h> // для работы SetConsoleCP, SetConsoleOutputCP
 
int main()
{
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
setlocale(LC_ALL,"Rus"); // Подключение русского языка
}

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

  1. Включаем библиотеку Windows.h для работы с функциями SetConsoleCP и SetConsoleOutputCP.
  2. Устанавливаем кодовую страницу win-cp 1251 в поток ввода с помощью функции SetConsoleCP.
  3. Устанавливаем кодовую страницу win-cp 1251 в поток вывода с помощью функции SetConsoleOutputCP.
  4. Подключаем русский язык с помощью функции setlocale(LC_ALL,Rus).

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

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