問題タブ [wifstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - (w)ifstreamはさまざまなエンコーディングをサポートしていますか
wifstreamを使用してテキストファイルをワイド文字列(std :: wstring)に読み取る場合、ストリーム実装はさまざまなエンコーディングをサポートしますか?つまり、ASCII、UTF-8、UTF-16ファイルなどの読み取りに使用できますか?
そうでない場合、私は何をしなければなりませんか?
(違いが生じる場合は、ファイル全体を読み取る必要があります)
g++ - Windows での iostream、wifstream、および eclipse/g++
MinGW ツール チェーン (g++ など) を使用して Windows で Eclipse を使用しています。wifstreamとwofstreamを使用してファイルを読み書きするダーウィン上に構築したプログラムがあります。プログラムは、ダーウィン(Mac)でEclipseを使用して動作し、機能します...私の問題ではありません。
コードを Windows に移動し、MinGW ツール チェーンと Eclipse を使用してビルドしようとすると、wifstream、wofstream、および wcout でコンパイル エラーが発生します。wstring として定義された変数は問題なくコンパイルされます。
例えば:
wifstream inFile; inFile.open(argv[2], ios_base::in);
コンパイルエラーになる
..\src\pdConv.cpp:31: エラー: 「wifstream」はこのスコープで宣言されていません
これは、コンパイラが wifstream を変数と見なしていることを示しているようです。インクルード ファイルで _GLIBCXX_USE_WCHAR_T ディレクティブが有効になっていないことに気付きました。これを自分で定義する必要がありますか、それとも環境内の何かがこれを知っているはずですか? 手動で定義すると、同じプログラムでワイド実装とナロー実装の両方を使用できないようです。
これはおそらく明らかですが、私は長い間この問題に悩まされてきました...笑..ここで何が欠けていますか?
c++ - std::wifstreamを使用してコンテンツをstd::wstringとして読み取る方法
私はこれを試しています:
しかし、私はこのコンパイルエラーを受け取りました:
演算子>>がwchar_tに実装されていないことを理解しています。
std::wifstreamへのドキュメントと参照はほとんど見つかりませんでした。どのように使用しますか?
c++ - C++のキリル文字でのファイルの読み取りと書き込み
最初にキリル文字でファイルを読み取り、次にランダムな数の行をランダムに選択して、変更したテキストを別のファイルに書き込む必要があります。ラテン文字には問題ありませんが、ゴミが出るため、キリル文字に問題が発生します。だから、これが私がそのことをやろうとした方法です。
言う、ファイルinput.txt
は
私はそれを読んで、すべての行をベクトルに入れる必要があります:
では、シンボルだけでなく、読みやすいものを生成するために、キリル文字をどのように使用できますか?
c++ - C++を使用してWinでUTF16ファイルを読み書きする方法
これに関してSOにはたくさんの質問がありますが、それらのほとんどはwstringをファイルに書き戻すことについて言及していません。たとえば、私はこれを読んで見つけました:
私は書くために同様のものを試しました:
しかし、それはゴミを生成します(またはNotpad ++とvimはそれを解釈できません)。タイトルで述べたように、Im on Win、ネイティブ C++、VS 2010。
入力ファイル:
これが結果です。
16 進数に変換:
vimの通常の出力:
t^@¬s^@t^@U^@T^@F^@1^@6^@!'^M^@ ^@t^@e^@s^@t^@
編集:UTF8を使用してしまいました。Andrei Alexandrescu は、これが最高のエンコーディングであり、大きな損失はないと言っています。:)
c++ - ファイルに書き込まれたUTF-8でエンコードされたURDU文字列から1文字を取得するにはどうすればよいですか?
私はウルドゥー語のヒンディー語の翻訳/音訳に取り組んでいます。私の目的は、ウルドゥー語の文をヒンディー語に、またはその逆に翻訳することです。私は、c++言語でビジュアルc++2010ソフトウェアを使用しています。UTF-8形式で保存されたテキストファイルにウルドゥー語の文を書きました。ここで、そのファイルから1文字ずつ取得して、同等のヒンディー語文字に変換できるようにします。入力ファイルから単一の文字を取得し、この単一の文字を出力ファイルに書き込もうとすると、出力ファイルに未知の醜い文字が配置されます。親切に適切なコードで私を助けてください。私のコードは次のとおりです
c++ - istreambuf_iterator を探しています明確化、Unicode 文字の完全なテキスト ファイルの読み取り
Scott Meyers による本「Effective STL」には、テキスト ファイル全体を std::string オブジェクトに読み込む良い例があります。
8 バイト文字として読み取ることに注意してください。これは非常にうまく機能します。最近では、Unicode テキスト (つまり、1 文字あたり 2 バイト) を含むファイルを読み取る必要があります。ただし、次のように、データを Unicode テキスト ファイルから std::wstring オブジェクトに読み込むように (単純に) 変更しようとすると、次のようになります。
返された文字列は、ワイド文字ですが、代替のヌルがまだ含まれています。たとえば、ファイルに Unicode 文字列「ABC」が含まれている場合、ファイルのバイト (Unicode 先頭バイト 0xFF、0xFE を無視) は次のようになります。 <'A'> <0> <'B'> <0> <' C'> <0>
上記の最初のコード フラグメントは、次の (char) 文字列の内容を正しく結果として返します。
sData [0] = 'A'<br> sData [1] = 0x00
sData [2] = 'B'<br> sData [3 ] = 0x00
sData [4] = 'C'<br> sData [5] = 0x00
ただし、2 番目のコード フラグメントが実行されると、(wchar_t) 文字列の内容が次のような望ましくない結果になります。
wsData [0] = L'A'<br> wsData [1] = 0x0000
wsData [2] = L'B '<br> wsData [3] = 0x0000
wsData [4] = L'C'<br> wsData [5] = 0x0000
あたかもファイルがまだバイトごとに読み取られ、単に個々の wchar_t 文字に変換されているかのようです。
wchar_t に特化した std::istreambuf_iterator は、ファイルが一度に 2 バイトずつ読み取られるべきだと思っていたのではないでしょうか? そうでない場合、その目的は何ですか?
私はテンプレートにたどり着きました(簡単な偉業ではありません;-)、イテレータは実際にファイルをバイトごとに読み取り、それを内部の変換ルーチンに渡しているようです。 2 バイトを受信した後でのみ)。
この一見些細なタスクについて、Web 上の多くのサイト (このサイトを含む) を検索しましたが、この動作の説明や、必要と思われる以上のコードを必要としない適切な代替案は見つかりませんでした (例: A Google Web を検索すると、同じ 2 番目のコード フラグメントが実行可能なコードとして生成されます)。
動作することがわかった唯一のものは次のとおりです。これは、wstring の内部バッファーに直接アクセスする必要があり、それを型強制する必要があるため、チートであると考えています。
ああ、避けられない「なぜファイルをバイナリ モードで開くのか、なぜテキスト モードで開くのか」という疑問を未然に防ぐために、ファイルがテキスト モード (デフォルト) で開かれたかのように意図的に開くということは、CR/LF ("\ r\n" または 0x0D0A) シーケンスは LF ("\n" または 0x0A) シーケンスに変換されますが、ファイルの純粋なバイト読み取りではそれらが保持されます。いずれにせよ、それらの頑固者にとって、それを変更しても、当然のことながら、何の効果もありませんでした.
ここで 2 つの質問があります。2 番目のケースが期待どおりに機能しないのはなぜですか (つまり、これらの反復子で何が起こっているのか)、そして Unicode 文字のファイルを wstring にロードする際のお気に入りの「コーシャ STL 方法」は何ですか? ?
ここで何が欠けていますか。それはばかげたものでなければなりません。
クリス
c++ - ランダムアクセスファイルの読み取り
ランダムアクセスファイルでデータを読み書きするためのC++アプリケーションを開発しました。(私はVisual C ++ 2010を使用しています)
これが私のプログラムです:
そして出力は次のとおりです。
しかし、私は期待してい Text2: Hello
ます。何が問題ですか??
ちなみに、output.write
クラス内(関数内)ではどうすればよいですか?
ありがとう
c++ - imbue を使用した wifstream、locale で valgrind エラーが発生する
ngrams を使用して言語検出器を実装しましたが、これまでのところすべて正常に動作しています。多数の言語を検出するために、実際の検出を開始する前に検出器が読み込む必要がある、サポートされている言語ごとに言語依存の ngrams ファイルのセットがあります。
これらのファイルを読み取るために、システムのデフォルト ロケール (私の ubuntu マシンでは en_US.UTF-8) を設定しました。これらのコード スニペットは私のlanguage_identifier
コンストラクターにあります。
ストリームを開く前に、imbue でロケールを設定します。
私の検出器を実行すると、valgrind は次の出力を提供します。
正確に覚えておらず、確認する機会もありませんが、ubuntu 10.04 LTS マシンでは上記の valgrind エラーはありませんでしたが、間違っている可能性があります。
この単純なプログラムでこれを再現することもできます。
ここで何が起こっているか知っている人はいますか?私は何かが恋しいですか?
コードは、gcc バージョン 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) を使用して、ubuntu 12.04LTS でビルドされています。
ヒントをありがとう!
c++ - ストリームを使用してクラス オブジェクトをファイルに書き込む
クラスオブジェクトをファイルにシリアル化/逆シリアル化するためのこのコードがあり、動作しているようです。ただし、2 つの質問があります。
- 代わりに 2 つの (現在のように) クラスに1 つと 1 つのメンバー変数
wstring
を持ちたい場合はどうすればよいでしょうか? (そのような場合、私のコードは機能しないと思いますか?)。wstring
string
- 最後に、以下のメインで、
s2.product_name_= L"megatex";
megatex の代わりにロシア語で何かを書いた場合 (たとえば、s2.product_name_= L"логин") を初期化すると、コードが意図したとおりに機能しなくなります。
何が間違っている可能性がありますか?ありがとう。
コードは次のとおりです。