Здравствуйте. У меня есть задача прочитать текстовый файл размером 10Мб. Самое простое что я смог придумать: Код (Text): ... std::ifstream in; std::string result; ... char line[ 6144 ]; while( in.getline( line , 6144 ) ) { result += line; }//while Но к сожалению работает не так быстро как хотелось. Поскажите пожалуйста, как можно ускорить чтение? Заранее спасибо!
andrew2008 поищи на rsdn.ru в ветке по С++. там вариантов штук 10 есть решения твоей задачи с тестами их скорострельности updated: вот, нашел: http://www.rsdn.ru/Forum/message/1186457.flat.aspx
Самое простое - не использовать std:: IMHO, с 10 Mb лучше всего работать через маппинг - со скоростью дискового доступа.
10 мб -- не громадный объем данных, так что я бы юзал std:: раз выделил (не забыв потом освободить ессно), и забыл. зачем меппинг и прочие сложности?? для начала потестили бы скорость работы при использовании std::, а потом уже к меппингу свой взгляд обратили ИМХО. тем более, что обращаясь к меппингу, мы делаем программу ОСезависимой.
В целом надо сделать следующее, вызвать программу как cgi скрипт в браузере IE7, которая просто отображает 10Мб файл. Попробовал некоторые варианты из ссылки http://www.rsdn.ru/Forum/message/1186457.flat.aspx. varnie - огромное Вам спасибо!!! Самый быстрый вариант: Код (Text): 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); Читаю файл целиком. В opera все работает отлично. В IE начинает выкидывать текст а потом зависает, начинает дебагер вызывать и все - крэш. А надо именно для IE7! Подскажите как можно сделать?
А зачем string? Работать с простым буфером imho логичнее, и безгеморойнее. И не забываем проверять сколько прочитали функой read.
я думаю, здесь проблемы не реализации, а чисто внешние: IE7. крайне сложно посоветовать что-либо с этим далее делать. а ежели просто файл открыть 10меговый в IE7, он не упадет? проверьте плз.
Просто файл он открывает, но открывал он 10Мб файл наверно минут 10)) Но проблем не возникало, то есть он не подвисал, скролл нормально бегал все время. Может надо чтобы программа выводила по 0.2Мб и засыпала на время?
Я нашел в чем была проблема правда пока не исправил ее. У меня в программе дополнительно к выводу содержимого файла выводился небольщой javascript. Код (Text): std::cout<<"<html>"; 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Мб файла.
А просто всосать весь файл в память и найти в нём переводы строки уже не модно? Задачу же не на 80386 с 4 метрами ОЗУ требуется решить, ведь правда?