Чтение больших файлов
У меня есть задача прочитать текстовый файл размером 10Мб.
Самое простое что я смог придумать:
std::ifstream in;
std::string result;
...
char line[ 6144 ];
while( in.getline( line , 6144 ) ) {
result += line;
}//while
Но к сожалению работает не так быстро как хотелось.
Поскажите пожалуйста, как можно ускорить чтение?
Заранее спасибо!
Подскажите как лучше сделать?
Просто в своей работе мне с таким сталкиваться не приходилось, у меня на работе используется БД для таких целей, но тут понадобилось?
Просто в своей работе мне с таким сталкиваться не приходилось, у меня на работе используется БД для таких целей, но тут понадобилось?
А в чем собственно состоит конечная цель? Зачем вам читать этот файл?
В целом надо иметь возможность вызвать эту программу как cgi скрипт в IE. Нашел другой вариант реализации:
std::string s;
s.erase();
if(in.bad()) return "";
//
// attempt to grow string buffer to match file size,
// this doesn't always work...
s.reserve(in.rdbuf()->in_avail());
char c;
while(in.get(c))
{
// use logarithmic growth stategy, in case
// in_avail (above) returned zero:
if(s.capacity() == s.size())
s.reserve(s.capacity() * 3);
s.append(1, c);
}
В opera прекрасно работает, приемлемо быстро. Чертов IE начинает вроде отображать текст а потом уходит в себя и не возвращается, но надо именно в нем.
Подскажите как-можно это исправить?
Сделал другую реализацию, прочитал весь файл разом
std::string str;
in.seekg( 0, std::ios_base::end);
std::ifstream::pos_type len = in.tellg();
in.seekg( 0 );
str.resize( len);
in.read( (char*)str.data(), len);
работает очень быстро, но опять таки в IE7 начинает виснуть, дебагер вызывает и все- крэш.
А нужно именно в IE7???
std::string str;
in.seekg( 0, std::ios_base::end);
std::ifstream::pos_type len = in.tellg();
in.seekg( 0 );
str.resize( len);
in.read( (char*)str.data(), len);
работает очень быстро, но опять таки в IE7 начинает виснуть, дебагер вызывает и все- крэш.
А нужно именно в IE7???
попробуй вместо
str.resize( len);
basic_string::reserve (len +1)
На самом деле на мой взгляд проблема не в том чтобы прочитать, читается нормально. то есть примерно 3 секунды уходит на чтение, это нормально.
а вот при выводе с помощью cout сразу 10Мб IE7 видно сходит с ума.
У меня в программе дополнительно к выводу содержимого файла выводился небольщой javascript.
std::cout<<"<script type='text/javascript' language='JavaScript'>function chngclr(bg,fnt) {";
std::cout<<"document.bgColor=bg; document.fgColor=fnt; }</script>";
std::cout<<"<form>";
//если это расскометарить то IE7 умрет
/*
std::cout<<"<input type=\"radio\" checked name='clr' onClick=\"chngclr('white','black');\">Áåëî-÷åðíûé<br>";
std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('yellow','blue');\">Æåëòî-ãîëóáîé<br>";
std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('red','white');\">Êðàñíî-áåëûé<br>";
std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('blue','yellow');\">Ãîëóáî-æåëòûé<br><br>";
*/
std::cout<<"</form>";
readAndDisplayContent( inFile );
std::cout<<"</body></html>";
Пока не понял почему IE7 глючит на вроде простом javascript в то время как opera отрабатывает нормально,
но по крайней мере выяснилось что проблема не в выводе 10Мб файла.