Информация об изменениях

Сообщение Re[3]: проблема с std::ifstream::open от 30.09.2016 18:48

Изменено 30.09.2016 18:50 _niko_

Здравствуйте, _hum_, Вы писали:

__>теперь переделал на

__>
__>QString qsFullFileName = QFileDialog::getOpenFileName(...);

__>if(!qsFullFileName.isEmpty())
__>        {
__>            //---
__>            std::ifstream ifs;

__>            ifs.open(qsFullFileName.toStdWString());
__>


__>заработало. но такой код вообще переносим (меня смущает конвертация из QString в std::wstring)?



На 99% уверен что проблемы была в кодировке, ибо вот:

QString qsFullFileName;

// Если исходный файл в кодировке: utf-8
qsFullFileName = QString::fromUtf8(R"(D:\work\Книги\test.txt)");
qsFullFileName = QTextCodec::codecForName("UTF8")->toUnicode(R"(D:\work\Книги\test.txt)");

// Если исходный файл в кодировке: Windows-1251
qsFullFileName = QTextCodec::codecForName("CP1251")->toUnicode(R"(D:\work\Книги\test.txt)");

std::ifstream ifs;
ifs.open(qsFullFileName.toLocal8Bit());

// Если код исполняется на ОС Windows (запуск из explorer'а, IDE)
ifs.open(QTextCodec::codecForName("CP1251")->fromUnicode(qsFullFileName));

// Если код исполняется на ОС Windows (запуск из CMD)
ifs.open(QTextCodec::codecForName("IBM866")->fromUnicode(qsFullFileName));

std::cout << "open = " << std::boolalpha << ifs.is_open() << std::endl;
Re[3]: проблема с std::ifstream::open
Здравствуйте, _hum_, Вы писали:

__>теперь переделал на

__>
__>QString qsFullFileName = QFileDialog::getOpenFileName(...);

__>if(!qsFullFileName.isEmpty())
__>        {
__>            //---
__>            std::ifstream ifs;

__>            ifs.open(qsFullFileName.toStdWString());
__>


__>заработало. но такой код вообще переносим (меня смущает конвертация из QString в std::wstring)?



На 99% уверен что проблемы была в кодировке, ибо вот:

QString qsFullFileName;

// Если исходный файл в кодировке: utf-8
qsFullFileName = QString::fromUtf8(R"(d:\WORK\!!!!!статья — блабла\programma\projs\conception\file)");
qsFullFileName = QTextCodec::codecForName("UTF8")->toUnicode(R"(d:\WORK\!!!!!статья — блабла\programma\projs\conception\file)");

// Если исходный файл в кодировке: Windows-1251
qsFullFileName = QTextCodec::codecForName("CP1251")->toUnicode(R"(d:\WORK\!!!!!статья — блабла\programma\projs\conception\file)");

std::ifstream ifs;
ifs.open(qsFullFileName.toLocal8Bit());

// Если код исполняется на ОС Windows (запуск из explorer'а, IDE)
ifs.open(QTextCodec::codecForName("CP1251")->fromUnicode(qsFullFileName));

// Если код исполняется на ОС Windows (запуск из CMD)
ifs.open(QTextCodec::codecForName("IBM866")->fromUnicode(qsFullFileName));

std::cout << "open = " << std::boolalpha << ifs.is_open() << std::endl;