VS2008で、Shift-JISのテキストファイルをShift-JISのまま行単位で読み込みたいのですが、
CStdioFile::ReadString()の引数はCStringのみで、CStringAがなく、
Unicodeを使うビルド設定だと、CStringWになってしまいます。
「行頭の○バイト目から○バイト目に○○が入っている」のようなテキストフォーマットなので、
ファイルからはCStringAの文字列として取り出さなければいけません。
読み込んだCString文字列を、CStringAに再変換すればできそうな感じはするのですが、
遠回りな感じがする上に、完全に同じShift-JIS文字列に戻せるのかが不安です。
CStdioFile::ReadString()ではそのような動作はできないものなのでしょうか?
CStdioFileはもともと(デフォルトでは)MBCSのファイルを読むようになっています。
つまり読み込みは
Shift_JIS→CString
と変換されます。
逆に書き出しは CString→Shift_JISと変換されます。(Unicodeしかない文字は化ける)
>読み込んだCString文字列を、CStringAに再変換すればできそうな感じはするのですが、
>遠回りな感じがする上に、完全に同じShift-JIS文字列に戻せるのかが不安です。
この方法でいいんじゃないでしょうか。
UnicodeはShift_JISコードの文字列をすべて表現できるし。
ダメなら自力で、CFile::Readで\nまで読むか(面倒)、
CStdiFileのメンバのm_pStreamを使って、fgetsで取得するとか。
うーーん、
CStringで読まずにchar型で読めばいいように思いますが、だめですか?
>「行頭の○バイト目から○バイト目に○○が入っている」のようなテキストフォーマッ
>トなので、ファイルからはCStringAの文字列として取り出さなければいけません。
これのあとにCStringで保存すればいいのではないでしょうか。
ありがとうございます。
>> 読み込んだCString文字列を、CStringAに再変換すればできそうな感じはするのですが、
>> 遠回りな感じがする上に、完全に同じShift-JIS文字列に戻せるのかが不安です。
> この方法でいいんじゃないでしょうか。
> UnicodeはShift_JISコードの文字列をすべて表現できるし。
CStdioFile::ReadString()で読み込んだCString文字列をCT2A()で再変換する方法で、
元々の正しいShift-JIS文字列(CStringA)として取り込めているようなので、
この方法で続けてみようと思います。
>CT2A
使う必要あります?
CString hoge;
//
CStringA moge;
moge = CStringA(hoge);
とコンストラクタだけで変換できるし。
>> CT2A
> 使う必要あります?
テキストを解析するルーチンはconst char*を引数に取る関数になっているため、
CT2A(hoge)を渡すようにしました。
引数を、CT2A(hoge)とするのと、CStringA(hoge)とするのって、
やってることは同じなんですかね。
ご意見ありがとうございます。
要望を整理してみると、
1.MBCSのファイルを読む。
2.内部でもMBCSとして処理する。
3.MBCSでファイルに書き出す。
であり、かつ
>「行頭の○バイト目から○バイト目に○○が入っている」のようなテキストフォーマッ
トなので、
を厳密に解釈すると、
4.これは中身は文字として認識できるデータしか入っていないが、
バイト数で位置を指定している以上、「バイナリファイル」として
扱わなければならない。
が、正解ですね。従って、
5.そもそも「CStdFile=(MBCS/Unicode)テキストファイル」を使うのが誤り。
と言えるのではないでしょうか。仮に、
6.そうはいってもテキストとして読み込みたい。
という場合でも、「汎用文字列関数群」つまりT系を使っているCStdFileは
コンパイルオプションで内部の系が変わってしまうため、
7.MBCSに固定されたファイルを読む目的には不向きである。
8.Unicodeファイルを読む場合でさえBOMに対応しているか仕様が不明確。
であるため、
9.一般に、CStdFileは、MBCS/Unicode共にこれらのテキストファイルを
読み込むには適当でないクラス。
という意見も受け入れざるを得ないと思えます。以上の様に、
10.文字コード系に関わらずにテキストファイルを読む場合、
一般にCStdFileを選択にはしてはならない。
のだと、考えられます。
どうしても使う場合は、それを継承したクラス
MBCS_StdFileなどを作成し、かつ、MBCSに固定して
コンパイルしたLibにしてから使用すべきだと考えられます。