Cで、ファイルや他の入力を一度に読むときに、どのようなサイズでバッファを宣言するのですか?fread:バッファのサイズを知るには?
char buffer[1024];
fp = popen("ls /", "r");
fread(buffer, 1, sizeof(buffer), fp);
入力データには、1000行または1行、さらには100000行以上が含まれます。
一般的なルールはありますか?
Cで、ファイルや他の入力を一度に読むときに、どのようなサイズでバッファを宣言するのですか?fread:バッファのサイズを知るには?
char buffer[1024];
fp = popen("ls /", "r");
fread(buffer, 1, sizeof(buffer), fp);
入力データには、1000行または1行、さらには100000行以上が含まれます。
一般的なルールはありますか?
いいえ、全般的なルールはありません。これは、データの処理計画に完全に依存するためです。それを解析するだけでいいですか?それは理想的だろう。あなたの入力が有用なデータ "samples"をXバイトの塊で持っていることを知っているならば、一度にXバイトを読み、あなたが行くようにそれらを扱います。
入力全体をバッファにコピーする必要がある場合は、最初の推測を行い、推測が不十分な場合はさらに多くのメモリを割り当てる必要があります。 (データはメモリ内で連続している必要はない場合やstd::deque
)
std::vector
を使用することができます。Cでは、先にmalloc
にしておき、すでに割り振っておいたスペースを使い果たしたときには、リードループの中にrealloc
を入れる必要があります。
std::vector
の動作を模倣することをお勧めします。これは、必要な回数を減らすのに役立つように、バッファを指数関数的に(1.5倍または2倍のような係数を掛けて)拡大することです。最初に1,024バイトを割り当てるとします。それがなくなると、2,048を割り当てます。それがなくなると、4,096を割り当てます。その他
あなたのユースケースと期待される名目上の入力に基づいて、適切な開始サイズを決めることができます。
'malloc'と' realloc'に感謝します。ちょうどそれを見て、それについての読書を持っています。しかし、私の場合はループなしで完全に読み取られます。 – lockdoc
@lockdoc - 取得するデータの量がわからない場合は、ループなしで完全に読み取ることはできません。 –
@lockdoc:それはあなたが尋ねているまさにその理由からではありません。 'fread'にはどんな長さの議論がありますか?これはブロックデバイスの場合には当てはまりませんが(入力が確実にファイルである場合は通常これを実行する方法があります)、一般に、ストリームを介して到着するデータの量を知ることはできません。それがストリームなので、コンテナではありません。ストリームデータを扱う際には、常にデータが大量に扱われるように、常に利用可能であると想像するのが最善です。 –
次のコードでは、テキストファイルからサイズがわからないことを確認しようとしています。だから、私はそのサイズを計算し、そのファイルから読み込むために使用されるforループの制限としてそのサイズを使用します。
void Read_from_file(char* f_name,int s)
{ int n=0;
FILE *file_ptr=nullptr;
file_ptr = fopen(f_name,"r");
struct stat st;
stat(f_name,&st); //accepts the file name and the struct to save this file
cout<<"File size "<<st.st_size<<endl;
char *mystring=new char[st.st_size];
for (int i = 0; i < st.st_size; i++)
{
mystring[i]=0;
}
if(file_ptr!=0)
{
cout<<"The file opened successfully\n";
while(n<st.st_size)
{
fread(mystring,sizeof(char),sizeof(mystring),file_ptr);
cout<<mystring;
n++;
}
}
ファイルのサイズを決定してください(重複した質問を参照)。そして、そのサイズのバッファを割り当てるのに 'malloc'を使う必要があります。 –
重複していない:freadは単にファイル 'fp = popen(" ls/"、" r ");' – lockdoc
@lockdocの代わりにコマンド自体の出力を含むこともできます。シーク不可能なバッファのサイズは不明です。 – sashoalm