Cでファイルの内容を文字列に読み取る方法は?

私はバッファ全体を生のメモリ チャンクとしてメモリにロードし、自分で解析を行う傾向があります。そうすれば、標準ライブラリが複数のプラットフォームで何をするかを最適に制御できます。

これは私がこれに使用するスタブです。また、fseek、ftell、および fread のエラー コードを確認することもできます。 (わかりやすくするために省略)

char * buffer = 0;
long length;
FILE * f = fopen (filename, "rb");

if (f)
{
  fseek (f, 0, SEEK_END);
  length = ftell (f);
  fseek (f, 0, SEEK_SET);
  buffer = malloc (length);
  if (buffer)
  {
    fread (buffer, 1, length, f);
  }
  fclose (f);
}

if (buffer)
{
  // start to process your data / extract strings here...
}

残念ながら OS に大きく依存するもう 1 つの解決策は、ファイルのメモリ マッピングです。一般に、アプリケーション ビューとオペレーティング システムのファイル キャッシュが実際に物理メモリを共有できるため、読み取りのパフォーマンスとメモリ使用量の削減が利点として挙げられます。

POSIX コードは次のようになります:

int fd = open("filename", O_RDONLY);
int len = lseek(fd, 0, SEEK_END);
void *data = mmap(0, len, PROT_READ, MAP_PRIVATE, fd, 0);

一方、Windows はもう少しトリッキーです。残念ながら、目の前にテスト用のコンパイラがありませんが、機能は CreateFileMapping() によって提供されます。 と MapViewOfFile() .


「内容を文字列に読み込む」がファイルにコード 0 の文字が含まれていないことを意味する場合は、getdelim() 関数を使用することもできます。この関数は、メモリ ブロックを受け入れて必要に応じて再割り当てするか、バッファ全体を指定された区切り文字またはファイルの終わりに到達するまで、ファイルを読み取ります。ファイル全体を読み取るには、区切り文字として '\0' を渡すだけです。

この関数は、GNU C ライブラリ (http://www.gnu.org/software/libc/manual/html_mono/libc.html#index-getdelim-994) で利用できます。

サンプル コードは次のように単純に見えるかもしれません

char* buffer = NULL;
size_t len;
ssize_t bytes_read = getdelim( &buffer, &len, '\0', fp);
if ( bytes_read != -1) {
  /* Success, now the entire file is in the buffer */