Я играл с std::wstring
и std::wfstream
, когда столкнулся со странным поведением. А именно, похоже, что std::basic_string<wchar_t>::find
не может найти определенные символы. Рассмотрим следующий код:
int main()
{
std::wifstream input("input.txt");
std::wofstream output("output.txt");
if(!(input && output)){
std::cerr << "file(s) not opened";
return -1;
}
std::wstring buf;
std::getline(input, buf);
output << buf;
std::cout << buf.find(L'ć');
}
Здесь я просто читаю первую строку файла input
и записываю ее в файл output
. Перед запуском программы содержимое первого файла aąbcćd
, а выходной файл пуст. После выполнения кода входной файл успешно копируется в выходной файл.
Что меня удивляет, так это то, что я попытался найти письмо ć
в buf
и столкнулся с упомянутым странным поведением. После выполнения программы я подтвердил, что выходной файл содержит ровно aąbcćd
, который, очевидно, содержит упомянутый символ ć
.
Однако строка std::cout << buf.find(L'ć')
не работает должным образом. Я не ожидал получить вывод 4
, учитывая расположение памяти std::wstring
, но я также определенно не ожидал получить std::string::npos
. Стоит отметить, что с помощью этого метода можно найти обычные символы ASCII.
Подводя итог, упомянутый код правильно копирует первую строку входного файла в выходной файл, но ему не удается найти символ в строке (возвращающий npos), который отвечает за хранение данных, которые должны быть скопированы. Почему это так? Что вызывает сбой find
здесь
Примечание: оба файла имеют кодировку UTF-8 в Windows.