改行文字の判別について

解決


茂山  2004-11-19 05:10:57  No: 55230

いつもお世話になっております。
現在、MFC7.0を使用してテキストファイルを
読み込むアプリケーションを作成しています。
ここで、改行文字がCR+LFであれば改行と見なし、
LFだけであれば改行とは見なさない、という仕様を
実現する必要が出てきました。

ファイル読込にはCStdioFile::ReadString()を使用しています。
このメソッドですとCR+LF、LFともに改行と見なされてしまうようです。
そこで、CStdioFile::ReadString()をオーバーライドし、
下記のように変更しましたが、今度は改行文字を認識しなくなってしまいました。

BOOL CStdioMyFile::ReadString(CString& rString)
{
    〜中略〜
    if ((nLen = (int)lstrlen(lpsz)) < nMaxSize )
    {
        //\r\n以外は改行と認めない
        if((lpsz[nLen-2] == '\n')&(lpsz[nLen-1] == '\n'))
        {
            break;
        }
    }
    〜後略〜
}

なにか、CR+LFとLFを判別する方法は存在するのでしょうか。
ご存知の方がいらっしゃいましたら何卒ご教授ください。
よろしくお願い致します。


KING・王  2004-11-19 05:48:27  No: 55231

#私の場合、めんどくさいですが、バイナリファイルとして読込み、
#\r\nの判別を自分で行うという方法をとりそうです。。

> if((lpsz[nLen-2] == '\n')&(lpsz[nLen-1] == '\n'))

この部分が、下記のまちがえでは?
if( (lpsz[nLen-2] == '\n')  && (lpsz[nLen-1] == '\n') )

> ここで、改行文字がCR+LFであれば改行と見なし、
> LFだけであれば改行とは見なさない、という仕様を
> 実現する必要が出てきました。

#なぜ、このような仕様が要求されたのかが、少し気になる。。。


(noname)  2004-11-19 20:06:32  No: 55232

( ´Д`)y-~~よう。
CStdioFile オブジェクトを生成する時,
第2引数にちゃんと CFile::typeBinary 使ってるか?
俺 MFC とかよく知らねーけど,ここが怪しいと思うね。

あと lpsz[nLen-2] と比較するべきなのは '\n' じゃなくて '\r' な。
まぁ単純なケアレスミスだろうけどよ。

>KING・王様
> #なぜ、このような仕様が要求されたのかが、少し気になる。。。

あれじゃないか? CRLF をレコードの区切りとして,LF をレコード内の
項目の区切りとするってやつ。
コンマ区切りだと,項目内でコンマ文字を使いたい場合に
面倒くさいからってんで,まれに LF が使われるらしいのな。
なら水平タブでも使ってろって感じだよな (;´Д`)y-~~


茂山  2004-11-22 19:44:22  No: 55233

KING・王さん、(noname) さん、
いろいろ教えてくださり大変感謝しております。
(noname)さんの方法(CStdioFileオブジェクト生成時の
第二引数でCFile::typeBinaryを使用する方法)で解決することが出来ました。

「改行文字がCR+LFであれば改行と見なし、LFだけであれば改行とは見なさない」
という仕様ですが、こちらも(noname) さんのご指摘どうりです。
私としても「もっとほかにやり方があるんじゃないのかな」とは思ったのですが。
ともあれ、皆様本当に有難うございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加