Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2016, 09:49   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию С, строки. Некорректный вывод в файл кириллицы

Ребят, помогите решить бином Ньютона, сколько знаком с языком С, но после простоты Делфи никак не отойду. Как вывести в файл кириллицу не используя класс стринг? Нужны именно строки, char, притом не char*

Код:

#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

int main()
{
    setlocale(LC_ALL,"Russian");

    char s[255];
    long long count_str=1;

    ofstream fout("file1.txt");

    if (fout)
    {
        cout << "zapolnite file strokami! (print 'end' to exit!)"<<endl<<"Input str #1: ";

        while   (gets(s))
        { if (strcmp(s,"end_file_$")==0) break;
            count_str++;
            cout<<"Input str #"<<count_str<<": ";

            fout<<s<<endl;
        }

        cout<<endl<<"Vsego zapisei: "<<count_str-1<<". File zapisan! \nPress Enter to exit";
    }
    else
        cout << "File is not correct!" << endl;



    fout.close();

}
И еще вопрос, возможно ли как-нибудь сделать то же самое, но чтоб кода было чуть меньше?

Пробовал избавиться от IF'a, записав в while &&(еще условие). Не работает.

вопрос не только касательно if'ов
Изображения
Тип файла: jpg Безымянный.jpg (80.3 Кб, 70 просмотров)
from dark to light)

Последний раз редактировалось Алексей_2012; 09.10.2016 в 09:51.
Алексей_2012 вне форума Ответить с цитированием
Старый 09.10.2016, 11:46   #2
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Какие манипуляции необходимо выполнить с потоком FStream, чтобы выводилась в файл (и читалась, соответственно) не абракадабра какая-то?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 09.10.2016, 12:07   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Никакие, он выводит то, что вы ему даете.

Для начала надо определиться в какой кодировке вы хотите файл: UTF-8, CP1251, ...

Если юникод (UTF-8), то скорее всего надо брать библиотеку типа ICU.

Если не юникод, то ... наверно должно и так работать если в настройках винды стоит русская локаль (чтоб открыть Блокнотом) и в s данные прочитались правильно. Может быть что-то типа SetConsoleCP(1251) надо.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.10.2016, 12:48   #4
Максай
Пользователь
 
Аватар для Максай
 
Регистрация: 21.07.2008
Сообщений: 40
По умолчанию

У меня на линуксе Ваша программа замечательно пишет кириллицу в файл.
На Windows, если мне не изменяет память, проблема вызвана тем, что кодировка ввода в консоли, по умолчанию, CP866, а Notepad ожидает в файле кодировку CP1251. Соответственно, нужно строчки перекодировать. Или функциями WinAPI сменить кодировку консоли.
Максай вне форума Ответить с цитированием
Старый 09.10.2016, 12:59   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Максай Посмотреть сообщение
Notepad ожидает в файле кодировку CP1251
или юникод.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.10.2016, 13:04   #6
Максай
Пользователь
 
Аватар для Максай
 
Регистрация: 21.07.2008
Сообщений: 40
По умолчанию

Если очень хочется лаконичности можно вот так извратиться:
Код:
int main()
{
    setlocale(LC_ALL,"Russian");

    char s[255];
    long long count_str=1;

    ofstream fout("file1.txt");

    cout << "zapolnite file strokami! (print 'end' to exit!)"<<endl<<"Input str #1: ";
    while( fout && gets(s) && strcmp(s,"end_file_$")!=0 )
    {
        fout << s << endl;
        cout << "Input str #" << ++count_str << ": ";
    }

        cout<<endl<<"Vsego zapisei: "<<count_str-1<<". File zapisan! \nPress Enter to exit";
}
Выражения в условии while должны быть именно в таком порядке, а не наоборот. По стандарту условия должны вычисляться слева направо.
P.S. Но лучше так, всё-таки, не делать. Что вам, строчек жалко?
Максай вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректный вывод вещественных элементов массива. Pug_from_Mordor Помощь студентам 2 04.01.2015 16:21
OpenGL. Функция display. Некорректный вывод dann.ftk Помощь студентам 1 16.07.2012 08:06
Некорректный вывод результата (1,#J) Drozd Oleg Общие вопросы C/C++ 3 25.09.2011 12:31
Некорректный вывод изображения Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 24.07.2010 00:12