C++ で一区切り毎にファイルを読み込む2023年01月27日 12時40分13秒

C++ のストリームは便利だが、逆に単純な操作を実装するのがややこしくなったりする。以下は、特定の大きさ毎にファイルを読み込む例。

C++ の istream には size_t readsome(char* buf, size_t size) という関数がある。これは、バッファの大きさを指定でき、戻り値は読み込んだ大きさ。しかし、この関数は、かなり実装依存な事、また内部バッファの状況によって動作が変わる。そんなわけで手元で実験しても、同じコードとバイナリでも、処理ファイルによって読み込みに支障があったり、同じコード、同じバイナリ、同じファイルでも読めないときがあったりで、信用できなかった。

ifstream には読み込み系の関数は結構ある。fstream を返す関数が多く、何文字読めたのかを返す関数がない。実は、read 系の関数を呼び出した後に、gcount() 関数を用いて何バイト読んだかを調べる。ファイルの終端に着いたかを調べる eof() 関数でループを回すのが見安くて良いと思う。

#include <fstream>

std::ifstream ifs{ filename };
if( ! ifs.is_open() )
    return;
while( ! ifs.eof() )
{
    char buf[ 1024 ];
    ifs.read( buf, sizeof( buf ) );
    len = ifs.gcount();
    ...
}
ifs.close();

前回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2023/01/27/9558551/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。