Shift-JISのまま行単位で読み込みたい – プログラミング – Home

Shift-JISのまま行単位で読み込...
 
通知
すべてクリア

[解決済] Shift-JISのまま行単位で読み込みたい


いしだ
 いしだ
(@いしだ)
ゲスト
結合: 17年前
投稿: 53
Topic starter  

VS2008で、Shift-JISのテキストファイルをShift-JISのまま行単位で読み込みたいのですが、
CStdioFile::ReadString()の引数はCStringのみで、CStringAがなく、
Unicodeを使うビルド設定だと、CStringWになってしまいます。

「行頭の○バイト目から○バイト目に○○が入っている」のようなテキストフォーマットなので、
ファイルからはCStringAの文字列として取り出さなければいけません。

読み込んだCString文字列を、CStringAに再変換すればできそうな感じはするのですが、
遠回りな感じがする上に、完全に同じShift-JIS文字列に戻せるのかが不安です。

CStdioFile::ReadString()ではそのような動作はできないものなのでしょうか?


引用未解決
トピックタグ
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 11年前
投稿: 28
 

CStdioFileはもともと(デフォルトでは)MBCSのファイルを読むようになっています。

つまり読み込みは

Shift_JIS→CString

と変換されます。
逆に書き出しは CString→Shift_JISと変換されます。(Unicodeしかない文字は化ける)

>読み込んだCString文字列を、CStringAに再変換すればできそうな感じはするのですが、
>遠回りな感じがする上に、完全に同じShift-JIS文字列に戻せるのかが不安です。
この方法でいいんじゃないでしょうか。
UnicodeはShift_JISコードの文字列をすべて表現できるし。

ダメなら自力で、CFile::Readで\nまで読むか(面倒)、
CStdiFileのメンバのm_pStreamを使って、fgetsで取得するとか。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

うーーん、
 CStringで読まずにchar型で読めばいいように思いますが、だめですか?

>「行頭の○バイト目から○バイト目に○○が入っている」のようなテキストフォーマッ
>トなので、ファイルからはCStringAの文字列として取り出さなければいけません。
これのあとにCStringで保存すればいいのではないでしょうか。


返信引用
いしだ
 いしだ
(@いしだ)
ゲスト
結合: 17年前
投稿: 53
Topic starter  

ありがとうございます。

>> 読み込んだCString文字列を、CStringAに再変換すればできそうな感じはするのですが、
>> 遠回りな感じがする上に、完全に同じShift-JIS文字列に戻せるのかが不安です。
> この方法でいいんじゃないでしょうか。
> UnicodeはShift_JISコードの文字列をすべて表現できるし。

CStdioFile::ReadString()で読み込んだCString文字列をCT2A()で再変換する方法で、
元々の正しいShift-JIS文字列(CStringA)として取り込めているようなので、
この方法で続けてみようと思います。


返信引用
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 11年前
投稿: 28
 

>CT2A
使う必要あります?

CString hoge;

//

CStringA moge;
moge = CStringA(hoge);

とコンストラクタだけで変換できるし。


返信引用
いしだ
 いしだ
(@いしだ)
ゲスト
結合: 17年前
投稿: 53
Topic starter  

>> CT2A
> 使う必要あります?

テキストを解析するルーチンはconst char*を引数に取る関数になっているため、
CT2A(hoge)を渡すようにしました。

引数を、CT2A(hoge)とするのと、CStringA(hoge)とするのって、
やってることは同じなんですかね。

ご意見ありがとうございます。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

要望を整理してみると、

 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にしてから使用すべきだと考えられます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました