dポイントプレゼントキャンペーン実施中!

ファイル読み込みについてなのですが、
文字コードがUNICODEの場合は出来たのですが、
UTF-8の場合、正しく読み込めないようなのですが、
何か原因があるのでしょうか?
ちなみに、読み込むファイルの文字コードはUTF-8にしています。

_wfopen_s(&fp, file_name, L"rt,ccs=UTF-8")でファイルを開いて、
fgetwcで読み込んでいるのですが、正しく読み込めません。
ちなみに、アクセス許可の種類をL"r"にしたら読み込めました。

原因(これが原因かもしれないでも構いません)とどのようにすればいいかを
教えて頂ければと思っています。

開発環境は、XP、Visual C++ 2010 Expressです。

A 回答 (1件)

こんな感じで r でも rt でも普通に読み込めていますが……


そもそも _set_fmode() を明示的に呼び出さない限り、既定で r モードと rt モードは同じのはず。

// .cpp 拡張子で保存して C++ モードでコンパイルしてください。

#include <cstdio>
#include <locale>
#include <conio.h>

void main()
{
_wsetlocale(LC_ALL, L"");

FILE* fp = NULL;
#if 1
// BOM 無し UTF-8
const errno_t er = _wfopen_s(&fp, L"utf8_test.txt", L"rt,ccs=utf-8");
#else
// BOM 付き(先頭に+3バイト)
const errno_t er = _wfopen_s(&fp, L"utf8_bom_test.txt", L"rt,ccs=utf-8");
#endif
if (er == 0 && fp)
{
wint_t ch = 0;
while (WEOF != (ch = fgetwc(fp)))
{
putwchar(ch);
}
fclose(fp);
}
_putws(L"Press any key to exit...");
_getch();
}


・テキスト ファイル作成に使用したソフト(テキスト エディタなど)は何ですか?
・テキスト ファイルは UTF-8 フォーマットで正しく保存されていますか?
・テキスト ファイルの内容はどのようなものですか?
・0x0D (CR) のような制御コードが混ざっていませんか?


開示されている情報が少ないと、回答者も推測しづらいです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

出来ました。
原因は、文字コード変換ソフトでした。
Visual C++ 2010で作成したソースコードのファイルをUnicodeやUTF-8などに
ソフトを使って変換していたのですが、そのソフトに原因があったようです。
メモ帳でUTF-8に保存し直してから試してみたらうまくいきました。
Unicodeで問題なかったのでUTF-8でも問題ないだろうと思ってしまいました。
でも、エディタ(サクラエディタ)では問題なく開けているので、
少し疑問が残りますが。

一応多くのファイルで試しておきたかったのですが、
1つ1つのファイルをUTF-8などに保存し直すのは時間がかかるので、
変換ソフトを使いました。

rモードとrtモードは_set_fmode()を呼び出さない限り意味が無いんですね。
ネットで色々調べていたらrtと書いてあるサイトもあったので、
rモードとrtモードどちらも試していて、rtモードで試している時に
質問させて頂いたのでrtのままでした。

まだ、細かい確認はしていないのですが、今の所ちゃんと読み込めているので、
一応締め切らせて頂きました。
回答ありがとうございました。

お礼日時:2011/01/22 22:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!