Где взять _fileno и _O_U16TEXT? - PullRequest
       88

Где взять _fileno и _O_U16TEXT?

0 голосов
/ 07 февраля 2019

Я пытаюсь напечатать текст «Ääkkösiä ruutuun».утешить с C ++.У меня Windows 7 и я использую редактор Code :: Blocks.В поисках предмета я обнаружил, что, возможно, такие строки помогут

_setmode(_fileno(stdout), _O_U16TEXT);
wstring s{L"Ääkkösiä ruutuun."};
wcout<<s<<endl;

. Но когда я пытаюсь скомпилировать его, я получаю ошибку: _fileno не было объявлено в этой области.

У меня есть все это, включая:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <stdexcept>
#include <cmath>
#include <sstream>
#include <fstream>
#include <codecvt>
#include <locale>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <cstdio>
#include <ostream>

что мне не хватает?

Кроме того, еще одна вещь, которую я попробовал, была локаль, но затем locale :: empty не была найдена!Почему в моем с ++ ничего нет?

РЕДАКТИРОВАТЬ Вот изображение того, что сейчас делает моя программа.

Она печатает только первую букву (А).Что происходит с остальными?

Ääkkösiä ruutuun, perkele!

Хорошо, похоже, setmode устанавливает его так, что печатается только одна буква.(Даже при попытке напечатать обычный текст несколькими командами просто получается одна буква.) Без этого скандинавские буквы печатаются неправильно, подумал.Они выглядят так:

enter image description here

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Строка

setlocale(LC_CTYPE, ".OCP");

работает!

Полный пример:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <fstream>

using namespace std;

wstring readFile(const char* filename) {
    wifstream wif(filename);
    locale myLoc("");
    //locale utf8_locale(locale(), new gel::stdx::utf8cvt<true>);
    wif.imbue(myLoc);
    basic_stringstream<wchar_t> wss;
    wss << wif.rdbuf();
    return wss.str();
}

int main() {
    setlocale(LC_CTYPE, ".OCP");
    wstring contents = readFile("test.txt");
    wcout<<L"Does anything get printed out at all???"<<endl;
    //wcout <<contents<<endl;
    wstring s{L"Ääkkösiä ruutuun."};
    wcout<<s<<endl;
    wcout<<L"Näkyykö äkköset?"<<endl;
    return 0;
}

Текст, прочитанный из файла (utf-8), по-прежнему не печатаетсяправильно, хотя.Это должно быть

Привет!
Täällä на kaksi riviä.

здесь все не так.

Вывод:

output with LC_TYPE_OCP

0 голосов
/ 07 февраля 2019

Ответ, который вы нашли, относится к Visual Studio, а не к Code :: Blocks.

В то время как стандарт C указывает, что должно быть в <stdio.h>, он указывает только минимум.Разработчики могут добавлять свои собственные функции и должны делать это, используя _ (префикс подчеркивания).Вот почему вы не должны использовать этот префикс.Вы не знаете, что сломаете.Microsoft четко сообщила об их нестандартных расширениях, используя правильный префикс.

Ответ помечен C ++, но C ++ наследует содержимое <stdio.h> от C.

...