Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
#1

Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? - C++

04.09.2013, 12:00. Просмотров 2672. Ответов 27
Метки нет (Все метки)

Считать UTF-8 текст на кириллице из файла? Нашел много способов, но все они страшные до безобразия. Также кажутся не оптимальными.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2013, 12:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? (C++):

Считать квадратную матрицу. Какой самый быстрый способ это сделать? - C++
Какие самые быстрые способы считывания в с++? Пример : мне надо считать квадратную матрицу. Какой самый быстрый способ это сделать?

Считать текст из файла с кодировкой utf-16 LE - C++
Возникла кое-какая проблема. У меня имеется xml файл, в кодировке UTF-16 LE с определенным содержимым. На данный момент мне нужно получить...

Считать utf-8 из файла - C++
Доброго времени суток. Задача следующая. Есть текстовый файл - словарь в utf-8 кодировке. Слова разделены переводом строки. Считываю...

Как правильно считать текст из файла? Весь текст, со всеми знаками, пробелами - C++
подскажите, чет затупил как правильно считать текст из файла(весь текст со всеми знаками пробелами и т.д.), чтобы поработать с этим текстом...

Определить, какой сначала был день самый тёплый или самый холодный? - C++
Динамическая память. В массив занесена информация о температуре за неделю. Определить, какой сначала был день самый тёплый или самый...

считать текст из файла - C++
в файле есть большой текст, мне нужно считать десять предложений, вывести их на экран, обработать, за тем считать еще десять предложений,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
04.09.2013, 12:11 #2
а в чем собственно должна заключаться универсальность?
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 12:15  [ТС] #3
Цитата Сообщение от AntonChik Посмотреть сообщение
а в чем собственно должна заключаться универсальность?
В использовании только средств С++, в ктраткости кода, в расходовании ресурсов, в удобочитаемости, etc.

Хотя да, вы правы, я хотел сказать "оптимальный способ"...
zer0mail
2332 / 1958 / 192
Регистрация: 03.07.2012
Сообщений: 7,021
Записей в блоге: 1
04.09.2013, 13:10 #4
Сначала надо понять, как прочитанные данные будут обрабатываться и храниться в памяти.
А самый универсальный - чтение бинарного файла в байтовый массив
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 13:14  [ТС] #5
Цитата Сообщение от zer0mail Посмотреть сообщение
Сначала надо понять, как прочитанные данные будут обрабатываться и храниться в памяти.
Допустим одна строка с помощью getline помещается в string и сразу выводится.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2013, 14:18 #6
C++
1
2
3
4
5
    auto contents = [] (const std::string& fileName)->std::string {
        std::ifstream in(fileName, std::ios::binary);
        return std::string(std::istreambuf_iterator<char>(in),
            std::istreambuf_iterator<char>());
    }("utf-8.txt");
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
04.09.2013, 14:41 #7
Цитата Сообщение от Герц Посмотреть сообщение
auto contents = [] (const std::string& fileName)->std::string {
* * * * std::ifstream in(fileName, std::ios::binary);
* * * * return std::string(std::istreambuf_iterator<char>(in),
* * * * * * std::istreambuf_iterator<char>());
* * }("utf-8.txt");
C++
1
2
3
4
5
6
7
8
auto contents = [] (const std::string& fileName)->std::string {
        std::ifstream in(fileName, std::ios::binary);
 
        return std::string(std::istreambuf_iterator<char>(in),
            std::istreambuf_iterator<char>());
    };
 
    std::cout <<contents(std::string("utf-8.txt")) <<std::endl;
Вот так работает.
Герц, это вы опечатались или это еще какая-то фича с++11 при задании аргумента-файла?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2013, 14:46 #8
gromo, Все там правильно.
Просто лямбда определяется и сразу же вызывается.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2013, 15:57 #9
Да, сделано исключительное ради ограничения области видимости std::ifstream in.
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
04.09.2013, 16:32 #10
Герц, но зачем лямбду-то использовать? В C++ и так блочная область видимости, это же не Javascript.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2013, 17:26 #11
Уединенный блок выглядит коряво.
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
04.09.2013, 17:29 #12
Герц, лямбда там, где она совсем не нужна, выглядит ещё более коряво.
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 20:38  [ТС] #13
Цитата Сообщение от gromo Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
auto contents = [] (const std::string& fileName)->std::string {
        std::ifstream in(fileName, std::ios::binary);
 
        return std::string(std::istreambuf_iterator<char>(in),
            std::istreambuf_iterator<char>());
    };
 
    std::cout <<contents(std::string("utf-8.txt")) <<std::endl;
Вот так работает.
Кириллица отображается кракозябрами по-прежнему...
Исходный код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <fstream>
#include <string>
 
int main(int argc, char *argv[])
{
    system("chcp 1251");
    //setlocale(LC_ALL, ".1251");
    for (int i=1; i<argc; i++)
    {
        auto contents = [] (const std::string& fileName)->std::string
        {
            std::ifstream in(fileName, std::ios::binary);
            return std::string(std::istreambuf_iterator<char>(in),
                std::istreambuf_iterator<char>());
        };
        std::cout <<contents(std::string(argv[i])) <<std::endl;
        /*std::ifstream file(argv[i]);
        if (!file.is_open())
            std::cout<<argv[i]<<": Файла с данным именем не существует\n";
        else
        {
            std::cout<<argv[i]<<std::endl;
            while (! file.eof() )
            {
                
                std::string buf;
                getline (file, buf);
                std::cout<<buf<<std::endl;
            }
        }*/
    }
    std::cout<<std::endl;
    std::system("pause");
    return 0;
}

visual studio 2012
Прикрепил сам текстовый файл
Вложения
Тип файла: txt 1.txt (629 байт, 9 просмотров)
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
04.09.2013, 22:24 #14
Попробуйте такой вариант. Вы шрифт на Lucida Console сменили в cmd.exe ?
Я не знаю, как там в VStudio, но пишут, что лямбды должен поддерживать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
#include <string>
int main(int argc, char* argv[])
{
    for(int i = 1; i < argc; ++i)
        std::cout<< [] (const std::string& fileName)->std::string {
            std::ifstream in(fileName, std::ios_base::binary);
 
            return std::string(std::istreambuf_iterator<char>(in),
                std::istreambuf_iterator<char>());
        }(argv[i]);
    return 0;
}
проверил на вашем файле 1.txt -- все работает. Пути к файлам задайте абсолютные (на всякий случай)
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 23:03  [ТС] #15
Цитата Сообщение от gromo Посмотреть сообщение
Вы шрифт на Lucida Console сменили в cmd.exe ?
Да, конечно.
Цитата Сообщение от gromo Посмотреть сообщение
Попробуйте такой вариант.
Также кракозябры вместо кириллицы...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2013, 23:03
Привет! Вот еще темы с ответами:

Считать текст из файла - C++
Как можно считать текст из файла?? ifstream fin(&quot;test.txt&quot;, ios::in|ios::nocreate ); if (!fin) {cout&lt;&lt;&quot;ERROR! &quot;&lt;&lt;endl; return 1;} ...

Как считать текст из файла? - C++
Подскажите, со считыванием из файла, а то добавил а обратно считать не могу, более подробно в комментакиях кода... Ну или с кодом для...

Как считать текст с файла ? - C++
Как считать текст с файла (например .txt) а потом в другой пустой файл записать текст с первого документа?

Как считать текст из файла в С++? - C++
Подскажите пожалуйста, как считать текст из файла в массив типа char в С++? Заранее спасибо!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.09.2013, 23:03
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru