各行に 512 ビットの 7000 エントリで構成される大きなテキスト ファイルがあり、ビット操作を実行できるように、各行を読み取って char 配列に格納したいと考えています。
推奨される効率的な方法はありますか?
ファイル全体をロードし、メモリ内のファイルへの各 512 ビット ブロックへのポインタを保持します。
ただし、より良い回答が必要な場合は、さらに情報を提供する必要があります。
char **load_file(const char *filename) {
size_t i, j, file_size;
char *file_ptr;
char **entries;
FILE *fd;
fd = fopen(filename, "r");
fseek(fd, 0, SEEK_END);
file_size = ftell(fd);
rewind(fd);
file_ptr = malloc(sizeof(char) * file_size);
fread(file_ptr, file_size, 1, fd);
fclose(fd);
/* 64 + 1 because newline is a character */
entries = malloc(sizeof(char *) * file_size/(64 + 1));
for (i = j = 0; j < file_size; i++, j += 64 + 1) {
entries[i] = &file_ptr[j];
}
return entries;
}
独自の仮定またはコードを提供した場合、私はより良い答えを導くことができますが、ここにあなたの質問に対する一般的な答えがあります...
fgets
(ドキュメントはこちら) を使用して各リーンのバイトを読み取り、ビット単位の演算を使用して個々のビットにアクセスできます。ファイルをプログラムにパイプする(またはファイル読み取りライブラリを使用して処理する)ことができるようにfgets
、から読み取ることができることに注意してください。stdin
文字配列については、有限配列ではなく動的配列を使用することをお勧めします。有限の配列を持つように設定されている場合は、スタックが大きなファイルでオーバーランする可能性があるため、(スタックではなく) メモリ プールに格納します (コール スタックのサイズは、使用しているアーキテクチャによって異なります)。