いつもお世話になっております。
現在、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を判別する方法は存在するのでしょうか。
ご存知の方がいらっしゃいましたら何卒ご教授ください。
よろしくお願い致します。
#私の場合、めんどくさいですが、バイナリファイルとして読込み、
#\r\nの判別を自分で行うという方法をとりそうです。。
> if((lpsz[nLen-2] == '\n')&(lpsz[nLen-1] == '\n'))
この部分が、下記のまちがえでは?
if( (lpsz[nLen-2] == '\n') && (lpsz[nLen-1] == '\n') )
> ここで、改行文字がCR+LFであれば改行と見なし、
> LFだけであれば改行とは見なさない、という仕様を
> 実現する必要が出てきました。
#なぜ、このような仕様が要求されたのかが、少し気になる。。。
( ´Д`)y-~~よう。
CStdioFile オブジェクトを生成する時,
第2引数にちゃんと CFile::typeBinary 使ってるか?
俺 MFC とかよく知らねーけど,ここが怪しいと思うね。
あと lpsz[nLen-2] と比較するべきなのは '\n' じゃなくて '\r' な。
まぁ単純なケアレスミスだろうけどよ。
>KING・王様
> #なぜ、このような仕様が要求されたのかが、少し気になる。。。
あれじゃないか? CRLF をレコードの区切りとして,LF をレコード内の
項目の区切りとするってやつ。
コンマ区切りだと,項目内でコンマ文字を使いたい場合に
面倒くさいからってんで,まれに LF が使われるらしいのな。
なら水平タブでも使ってろって感じだよな (;´Д`)y-~~
KING・王さん、(noname) さん、
いろいろ教えてくださり大変感謝しております。
(noname)さんの方法(CStdioFileオブジェクト生成時の
第二引数でCFile::typeBinaryを使用する方法)で解決することが出来ました。
「改行文字がCR+LFであれば改行と見なし、LFだけであれば改行とは見なさない」
という仕様ですが、こちらも(noname) さんのご指摘どうりです。
私としても「もっとほかにやり方があるんじゃないのかな」とは思ったのですが。
ともあれ、皆様本当に有難うございました!
ツイート | ![]() |