PM>ある程度のサイズ(私の環境では約1MB)を超えるファイルだと現象が出ます。サイズは関係ないはずなんですけどねぇ...。バッファに収まるかどうかで挙動変わるんでしょうか?バイナリモードで書き込んで、テキストモードで読み出す。いう処理をしているので、改行コードの変換部分でサイズの変化があるのでしょう。テキストモードで書き込んで、バイナリモードで読み出す。似たような問題が発生するでしょうけど。CStdioFile::Read()ではなく、CStdioFile::ReadString()で読み込むべきかと思います。CStdioFile::Read()は継承元のCFile::Read()になるでしょうけど。PM瀬戸っぷさん返信いただきありがとうございます。試しに、テキストモードで書き込みテキストモードで読み出すよう変更しましたが、同様の現象が出ました。(下記の部位について、変更を行いました。速度が遅いため使用を躊躇しています。バイナリモードでWrite、Readともに行うことで、一応の現象の回避はできていますが、根本的な原因の解明にはなっていないので、引き続きよろしくお願いいたします。nReadSizeとなっていました。0Ahを0Ahに変換しているようです。1050行で、nReadSizeが1050バイト分ほど少ない。0Ah)に変換されます。内部的には改行は\nで扱うべき...となります。CStdioFile::Read()でも変換は生きるんですねぇ......。サイズで動作に差が出る原因は不明...なままです。AMバイナリモードで書き込んで、テキストモードで読み込んだ状態で...メモリウィンドウで終端部分をダンプしてみました。00......先に出てくる0Ahまでが、本来読み込み完了した位置(szBuf[nReadSize])になります。CStdioFile::Read()としては、「読み込んだと報告した位置以降」なので、知ったこっちゃないよ。読み込みできるバッファサイズを越えていたりもしませんし。「文字列として読み込んだ」わけではないので、「読み込んだと報告した位置」の後に終端マーク('\0')の付与はしていない。プログラマが責任もって付けろ。0Ahを0Ahに切り詰めるという処理を指定されたバッファ内で行っていて、その時のデータが「読み込んだと報告した位置以降」に残っている。いうことかも知れません。0Ahで終わっている。_T('\0');として、明示的に「終端マーク」を設定することで正しく動作するかと。AM>先に出てくる0Ahまでが、本来読み込み完了した位置(szBuf[nReadSize])ちょっと間違えたか。00......となりました。今回の場合'\r'か'\n'を発見すると区切ります。「\r\nと連続した場合」ではありませんのでご注意を。PM回答については、瀬戸っぷさんのご指摘の通りでしょう。ところで、CStdioFileクラスなのですが、コンパイルオプションで文字コードを(1)MBCSにしている場合は入出力がMBCS(ASCII/Shift-JIS)(2)Unicodeにしている場合は入出力がUnicodeの専用になってしまい。UnicodeアプリとしてコンパイルするとMBCSの入出力ができなくなってしまうようなクラスです。何か裏道があるのかもしれませんけどみあたりませんでした。現状、(A)MSの公式見解として「MBCS用のMFCは非推奨」。UnicodeのMFCはOK。(B)なので、UnicodeのMFCからは、CStdioFileを使ってASCII文字の入出力ができない。いう事態になっているようです(やれやれ)。AM瀬戸っぷさん丁寧に調査していただきありがとうございます。0Ahを0Ahに変換しているようです。1050行で、nReadSizeが1050バイト分ほど少ない。GetLength()で得た値とReadの戻り値の相違は、ちょうど改行文字が1バイトに変換された分ですね。こちらは想定どおりの結果です。0Ah)に変換されます。>内部的には改行は\nで扱うべき...となります。CStdioFile::Read()でも変換は生きるんですねぇ......。プログラムで改行を\r\nで扱うと、テキストモードで書き込むと、改行変換の結果、余計な\rが付与されてしまう、ということですね。気を付けなければならないですね。0Ahを0Ahに切り詰めるという処理を指定されたバッファ内>で行っていて、その時のデータが「読み込んだと報告した位置以降」に残っている。>ということかも知れません。0Ahで終わっている。メモリにバイナリデータを読み込んだのち、クリアせずに切り詰め処理を行っているということでしょうかね。途半端に残っているのかもしれませんね。(あくまでも推測ですが)>明示的に「終端マーク」を設定することで正しく動作するかと。その手がありましたね。私の環境でもこの方法で正しく動作することを確認しました。バイナリモードに変更するより、こちらの方法が簡潔でよさそうですね。>strtok()では、第2引数の文字列内の「いずれかの文字」で区切るので、>今回の場合'\r'か'\n'を発見すると区切ります。>「\r\nと連続した場合」ではありませんのでご注意を。こちらは誤解しておりました。指摘していただきありがとうございます。AM仲澤@失業者さん貴重な情報をいただきありがとうございます。>(A)MSの公式見解として「MBCS用のMFCは非推奨」。UnicodeのMFCはOK。>(B)なので、UnicodeのMFCからは、CStdioFileを使ってASCII文字の入出力ができない。MFCのMBCS版が非推奨ということを確認しました。既存のアプリでUnicode対応を迫られることになり、なかなか面倒な事態ですね。PM>MFCのMBCS版が非推奨ということを確認しました。MBCS版の追加パッケージがダウンロ-ドできました。今もできるかな?MBCSでプロジェクト設定すると可能になります。Unicodeは使えなくなるのかな?_T()は使えたはずですね。1年前モードレスダイアログの子のモーダルダイアログ表示中に親のモードレスダイアログを操作禁止にしたいメインダイアログ(MainDlg)に子ダイアログでモードレスダイアログ(DlgA)があります。様、ご教示有難うございます。1年前Microsoftのホームページでエラーが出て接続できない。コピーららららららのエンジニアラウンジホームプロフィール大手SIerで課長しております。C++/Java/C#/RDBのレガシーな人だけど新技術キャッチアップしたいおじさん。Reserved.メンバーお問い合わせタイトルとURLをコピーしました。