#include <fstream>
#include <iostream>
#define INITIAL_BUFFER_SIZE 1
#define BUFFER_MULTIPLIER 2
#define MULT_STEPS 9
using namespace std;
int main(int argc, char *argv[])
{
ifstream fsr(argv[1], ios::in);
if ( fsr.fail() )
{
cout << "Can't open input file" << endl;
return -1;
}
int bufferSize = INITIAL_BUFFER_SIZE;
for (int i = 1; i <= MULT_STEPS; i++)
{
char *c = new char[bufferSize+1];
if (c == NULL)
{
cout << "Can't allocate memory" << endl;
return -1;
}
cout << endl << "*** Buffer size = " << bufferSize << " ***"<< endl;
fsr.seekg(0,ios::beg);
while ( !fsr.eof() )
{
fsr.read(c, bufferSize);
cout << c;
}
delete c;
bufferSize *= BUFFER_MULTIPLIER;
}
fsr.close();
return 0;
}
ifstream - проблемы с чтением
Читаю файл, размером кратный 256 байтам в цикле, наращивая размер буфера (1, 2, 4, 8, 16, 32, 64, 128, 256). Читает (или по крайней мере выводит на экран) только в первой итерации. Откывать и закрывать файл в цикле не предлагать. Думаю там должно быть что-то вроде flush?
На второй итерации [FONT="Courier New"]fsr.eof()[/FONT] - по-прежнему будет true. Выводы - самостоятельно, но я бы использовал [FONT="Courier New"]fsr.clear()[/FONT] ;)
fsr.clear() помогло :)
для тех, кто будет наступать на эти же грабли:
функция clear(), принадлежащая классу ios (если не ошибаюсь) предназначена для обнуления(установления) состояния потока. например:
eofbit – признак конца файла;
failbit – ошибка форматирования, но символы не утеряны;
badbit – потеря данных;
goodbit – ошибок нет.
Это ещё раз доказывает полезность поиска по форуму:
http://forum.codenet.ru/showthread.php?p=157964#post157964
Цитата:
Это ещё раз доказывает полезность поиска по форуму:
в жизни не догадался бы искать что то подобное в топике с названием "как заставить cin считывать только числа"
изящно, а главное работает. спасибо большое.