Не конструируется std::istream_iterator для wchar_t | C++
И компилятор ругается, что я не могу создать итератор для std::wifstream . Хотя у std::wifstream char_type — это wchar_t, и для итератора я указал wchar_t. Что не так я делаю?
Отслеживать
задан 19 фев 2022 в 14:52
ComeInRage ComeInRage
1,590 6 6 серебряных знаков 14 14 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Дело в том, что первый аргумент шаблона istream_iterator и ostream_iterator — это тип, который будет извлекаться из потока, т.е. это может быть int , double или любой другой тип. А вот второй аргумент — это уже тип символов самого потока. Это может быть char или wchar_t и т.п. Значит итераторы нужно обьявлять так:
using in_it = std::istream_iterator; using out_it = std::ostream_iterator;
Отслеживать
ответ дан 19 фев 2022 в 15:08
user361068 user361068
Спасибо, задам смежный вопрос. Почему код выше (с учетом правок для wchar_t) в выходном файле все пишет в одну строку, хотя в исходном есть переносы строк
19 фев 2022 в 15:30
@ComeInRage Вроде и пробелы должен пропускать тоже. Извлечение данных из потока происходит также как и при использовании оператора >> . А значит пропускает все пробельные символы, в том числе и перевод строки.
– user361068
19 фев 2022 в 15:42
Понял, спасибо. Буду крайне признателен, если подскажете способ не пропускать спецсимволы и пробелы)
19 фев 2022 в 15:48
@ComeInRage Попробуйте использовать istreambuf_iterator вместо istream_iterator
– user361068
19 фев 2022 в 15:55
Это как раз то, что нужно. Спасибо. Только никак не могу понять в чем разница между stream и streambuf. В документации написано, что stream реализованы с помощью streambuf. То есть все stream — это обертки вокруг streambuf, а сам streambuf — это обертка вокруг хранилища с данными файла? :/
Для чего нужен тип `wchar_t`?
Проще говоря, этот тип используется для представления значений расширенных наборов символов, которые соответствуют национальным языкам.
В настоящее время стандарт C++ поддерживает следующие типы для представления знаков наборам символов, включая расширенные наборы, как, например, символы UNICODE:
char, char16_t, char32_t, wchar_t
Пример использования «широкого» строкового литерала
#include int main()