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

fopen , fgets に関して質問させてください。
現在「readme」というファイルを UTF-8 にて開こうとしております。
fopen でファイルは開けているようなのですが、fgets を呼び出した際に以下の様なメッセージが出て異常終了してしまいます。


『Microsoft Visual Studio C ランタイム ライブラリは Sample.exe に致命的なエラーを検出しました。
[中断] をクリックしてプログラムをデバッグするか、または [続行] をクリックしてプログラムを終了してください。』

UTF-8 を指定しない場合は上手く動いているようです。
UTF-8 の時は特殊な取り出し方をしなければならないのでしょうか?

Visual C++ 2008 Express Edhition の デバックモードで動かしています。

******************************
1 : FILE *file1;
2 : char s[256];
3 :
4 : file1 = fopen( "C:\\readme", "r, ccs=UTF-8");
5 : while (fgets(s, 256, file1) != NULL)
6 : {
7 : printf("%s", s);
8 : }
******************************

A 回答 (2件)

> ccs=UTF-8


を指定した場合、ワイド文字型配列にしか受け取れないらしいです。
つまり
>char s[256];
>while (fgets(s, 256, file1) != NULL)
ではダメで
wchar_t s[256];
while (fgetws(s, 256, file1) != NULL)
にしないといけない。

ちなみに
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: C:\XXXX\test.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\fgets.c
Line: 75

Expression: ( (_Stream->_flag & _IOSTRG) || ( fn = _fileno(_Stream), ( (_textmode_safe(fn) == __IOINFO_TM_ANSI) && !_tm_unicode_safe(fn))))

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
中止(A) 再試行(R) 無視(I)
---------------------------

というような警告メッセージが出るはずなので、そのまま貼り付けてもらうほうが
回答が付きやすいと思います。
メッセージボックス表示中に Ctrl + C で内容をコピーできますし。
    • good
    • 0
この回答へのお礼

ありがとうございます!
やはりワイド文字列しか受け取れないのですね。
そうかもとは思っていましたが、これで確信が持てました。


警告メッセージは質問で書いたものしか出ませんでした。
エラーの見方が悪いだけかもしれませんが。。。
どの様なオペレーションで確認できますでしょうか?

お礼日時:2008/10/16 23:07

ccsとは何でしょうか。

この回答への補足

http://msdn.microsoft.com/ja-jp/library/yeby3zcb …
fopen("newfile.txt", "rw, ccs=<encoding>");
といった感じで、encoding を指定してファイルを開く時に使用するようです。

補足日時:2008/10/16 22:59
    • good
    • 0

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