WindowsアプリケーションのC++標準ライブラリを使用してファイルを開くのは難しいと思われますが、それは基本的なことです。ここではUnicodeはUTF-8を意味しますが、UTF-16などに変換できます。ポイントはUnicodeファイル名からofstreamインスタンスを取得しています。自分のソリューションをハックする前に、ここに優先ルートがありますか?特にクロスプラットフォームのプラットフォームですか?uniodeファイル名でstd :: fstream(ofstreamまたはifstream)を開く方法は?
答えて
C++標準ライブラリはUnicode対応ではありません。 char
およびwchar_t
は、Unicodeエンコーディングである必要はありません。 MSVCを使用してWindows上で
、wchar_t
はUTF-16ですが、標準ライブラリのUTF-8のファイル名には直接のサポートはありません(char
データ型は、Windows上でUnicodeではない)
(したがって、MicrosoftのSTL) 、ファイルストリームのコンストラクタは、あなたのようにストリームを作成することができ、const wchar_t*
ファイル名をとる用意されています
wchar_t const name[] = L"filename.txt";
std::fstream file(name);
しかし、この過負荷がC++ 11規格で規定されていないが(それが唯一の存在を保証しますchar
ベースのバージョン)。バージョンg ++ 4.8.xでは、GCCのMinGW用libstdC++(-w64)のような代替STL実装にも存在しません。
Windowsのchar
と同じように、UTF8ではなく、他のOSではwchar_t
がUTF16でない場合があります。全体的に見て、これは移植性がない可能性があります。 wchar_t
というファイル名のストリームを開くことは標準では定義されておらず、char
にファイル名を指定するのは難しいかもしれません。
"fstreamは両方のwchar_tを受け入れることが保証されています..."とはどういう意味ですか?私は公式の98標準にアクセスすることはできませんが、n2857のbasic_fstreamのwchar_t * ctor(つまり、現在のC++ 0x作業草案であるIIUC)を見つけることができません –
あなたが正しいように見えます。私は修正済みです – jalf
@Éric:basic_fstreamのコンストラクタは'03標準の27.8.1.12で定義されており、引数なしとchar *の2つがあります。fstreamはbasic_fstream
現在のバージョンのVisual C++のstd :: basic_fstreamにはopen()
メソッドがあり、これはhttp://msdn.microsoft.com/en-us/library/4dx08bh4.aspxに従ってwchar_t *をとります。
これは最終的に/理論的に移植可能になるのだろうか? –
すべてのOSとファイルシステムがUnicodeファイル名をサポートするわけではありませんので、移植性がありません。 NTFSはUnicodeファイル名をサポートしているので、wchar_t * open()とfstreamのコンストラクタはMicrosoftの拡張です。 –
またはNTFSがUTF16を使用してUnicodeファイル名をエンコードするためです。 LinuxはUnicodeのファイル名もサポートしていますが、UTF8を使用していますので、通常のchar *のバージョンはそこで動作します – jalf
std::wofstream
,std::wifstream
およびstd::wfstream
を使用する。彼らはユニコードファイル名を受け入れます。ファイル名はwstring
、配列はwchar_t
であるか、_T()
マクロ、またはテキストの前にプレフィックスL
が必要です。
'std :: wfstream'が' Unicode'であるという証拠を提供できますか?私の知る限りでは、ワイド文字である 'wchar_t'を使用します。通常は' 16-bit'です。しかし、内容は「Unicode」であってもなくてもかまいません。 –
私が言ったのは、彼らが質問に答えるユニコード文字列を受け入れるということですね。 – Brackets
実際には、質問の半分に答えます.WFストリーム(またはあなたのfstreamのUTF8)でファイルパスUTF16を取得したとしましょう。 WindowsはUnicodeを受け入れず、特殊文字(中国語など)を使用している場合は「間違ったURL」を返します。 –
はBoost.Nowideを見てください:
#include <boost/nowide/fstream.hpp>
#include <boost/nowide/cout.hpp>
using boost::nowide::ifstream;
using boost::nowide::cout;
// #include <fstream>
// #include <iostream>
// using std::ifstream;
// using std::cout;
#include <string>
int main() {
ifstream f("UTF-8 (e.g. ß).txt");
std::string line;
std::getline(f, line);
cout << "UTF-8 content: " << line;
}
- 1. のstd ::はifstream、STD :: istream_iteratorとstd ::コピーはファイル全体
- 2. はifstream方法
- 3. std :: fstreamファイル2GB以上
- 4. std :: fstream Windows C++でファイルを読む
- 5. C++ ifstreamはファイルを開けません
- 6. ストリーム上で、テンプレートクラスは、STDの両方:: coutのとstd :: ofstreamの
- 7. std :: ofstreamはDLLで異なった動作をします
- 8. fstreamでフロッピーを開ける方法
- 9. std :: ofstreamとsystem touch
- 10. のstd :: fstreamのエラー
- 11. ファイル名の文字列をofstream :: openに渡す方法
- 12. アプリエンジンパッチでファイルを開く方法は?
- 13. Ubuntuで.accdbファイルを開く方法は?
- 14. フルパスでファイルを開く方法は?
- 15. ブラウザでPDFファイルを開く方法は?
- 16. std :: for_eachまたはstd :: transformを使ってfor-loopを書く方法は?
- 17. nodejs inodeでnfsファイルを開く(またはファイルを開くための最も速い方法)
- 18. ファイルではなくchar *に基づいてstd :: ifstreamを作成できますか?
- 19. std :: ofstreamへの静的参照を初期化する方法は?
- 20. IOSでダウンロードしたファイルをアプリで開く方法は?
- 21. C++でifstreamを使用してファイルを開くことができません
- 22. std :: ofstream :: close()は実際に何をしますか?
- 23. C++のテンプレート出力:iostreamまたはfstream
- 24. .msu拡張ファイルを開く方法は?
- 25. .sqlファイルをローカルに開く方法は?
- 26. サーバディレクトリからファイルを開く方法は?
- 27. 指定したプログラムでコマンドラインからファイルを開く方法は?
- 28. std :: fstream、boost、またはその他のものを使ってフォルダファイルを作成する方法
- 29. なぜstd :: fstreamクラスはstd :: stringをとらないのですか?
- 30. MacOSでのC++ std :: fstreamの動作
Iこれは、[複製](http://stackoverflow.com/questions/480849/windows-codepage-interactions-with-standard-cc-filenames)であります質問。そこにある回答が役立つかどうかを確認してください。 –
'std :: wofstream'のようなデータ型を使わないのはなぜですか? ** w **に注意してください! – sergiol