1 つの大きなファイル (約 10 GB) のすべてのブロックを順番に読み取る必要があります。ファイルには、次のようにいくつかの文字列を含む多くのフロートが含まれています (各項目は '\n' で分割されています):
6.292611
-1.078219E-266
-2.305673E+065
sod;eiwo
4.899747e-237
1.673940e+089
-4.515213
MAX_NUM_PER_FILE
毎回アイテムを読み込んで処理し、別のファイルに書き込んでいますが、いつifstream
終了するかわかりません。これが私のコードです:
ifstream file_input(path_input); //my file is a text file, but i tried both text and binary mode, both failed.
if(file_input)
{
file_input.seekg(0,file_input.end);
unsigned long long length = file_input.tellg(); //get file size
file_input.seekg(0,file_input.beg);
char * buffer = new char [MAX_NUM_PER_FILE+MAX_NUM_PER_LINE];
int i=1,j;
char c,tmp[3];
while(file_input.tellg()<length)
{
file_input.read(buffer,MAX_NUM_PER_FILE);
j=MAX_NUM_PER_FILE;
while(file_input.get(c)&&c!='\n')
buffer[j++]=c; //get a complete item
//process with buffer...
itoa(i++,tmp,10); //int2char
string out_name="out"+string(tmp)+".txt";
ofstream file_output(out_name);
file_output.write(buffer,j);
file_output.close();
}
file_input.close();
delete[] buffer;
}
コードがうまくlength
いかず、実際のファイル サイズよりも大きくなっています。file_input.good()
またはを試してみ!file_input.eof()
ましたが、機能しませんでした。getline(file_input,s)
良いですが、よりもはるかに遅いです。read
必要ですが、ファイルの終わりread
かどうかを確認する方法がわかりません。ifstream
私はVS2010を使用してWINDOWS 7で作業を行っています。
私は検索しましたが、それについての答えはありません.ifstreamを使用してファイルを開き、最後まで読み続ける方法このリンクは私の質問に答えることができません.
アップデート、問題解決
皆さん、こんにちは。私のせいだとわかりました。両方ともwhile(file_input.tellg()<length)
うまくwhile(file_input.peek()!=EOF)
いきます!while(file_input.peek()!=EOF)
がおすすめ。
end-of-file の後に追加で書き込まれる項目はbuffer
、最後に書き込まれた残りの項目です。
正しいコードは次のとおりです。
ifstream file_input(path_input);
if(file_input)
{
//file_input.seekg(0,file_input.end);
//unsigned long long length = file_input.tellg(); //get file size
//file_input.seekg(0,file_input.beg);
char * buffer = new char [MAX_NUM_PER_FILE+MAX_NUM_PER_LINE];
int i=1,j;
char c,tmp[3];
while(file_input.peek()!=EOF)
{
memset(buffer,0,sizeof(char)*(MAX_NUM_PER_FILE+MAX_NUM_PER_LINE)); //clear first!
file_input.read(buffer,MAX_NUM_PER_FILE);
j=MAX_NUM_PER_FILE;
while(file_input.get(c)&&c!='\n')
buffer[j++]=c;
itoa(i++,tmp,10);//int2char
string out_name="out"+string(tmp)+".txt";
ofstream file_output(out_name);
file_output.write(buffer,strlen(buffer)); //use the correct buffer size instead of j
file_output.close();
}
file_input.close();
delete[] buffer;
}