Кодировки Карл, как в бинарном 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"); // Подключение русского языка }
Объяснение кода листинга программы
- Включаем библиотеку Windows.h для работы с функциями SetConsoleCP и SetConsoleOutputCP.
- Устанавливаем кодовую страницу win-cp 1251 в поток ввода с помощью функции SetConsoleCP.
- Устанавливаем кодовую страницу win-cp 1251 в поток вывода с помощью функции SetConsoleOutputCP.
- Подключаем русский язык с помощью функции setlocale(LC_ALL,
Rus
).