В дополнение к предыдущей задаче. Прошу прощения у модераторов, но теперь проблема немного в другом, поэтому создал дополнительную тему. Изначально, у меня стояла задача прочитать и отобразить файл размеров 10 Мб в браузере IE7. То есть должна быть программка для вызова ее как cgi скрипт. Я программку написал, под opera все отлично работает и отображает документ полностью секунд за 5. То есть я вытащил весь файл разом и вывел его в pre тегах. С IE7 проблема, документ отображается медленно. То есть начальная загрузка большей части документа быстрая, но потом он еще долго выдает, фактически построчно, оставшуюся часть файла. А мне надо чтобы можно было с помощью скроллинга IE перейти в конец и увидеть конец документа(из файла). По крайней мере так стоит задача? Помогите, пожалуйста, кто знает как можно это осуществить??? Заранее благодарен за помощь!!!
А как это программно сделать? Я считал весь файл в std::string. Я пытался выводить этот string частями по 0.2Мб, быстрее все равно не стало. Наверно как то можно запрограммировать реагирование на события скроллинга IE7 и при скроллинге выдавать примерно содержимое из этого string и одновременно выводить весь этот string в браузер? Только я не знаю как это сделать и не уверен что это вообще можно сделать? По крайней мере одновременно показывать часть текста по скроллингу и выводить все содержимое в браузер?
В любом случае вывод сразу столькой инфо в IE всей вместе, будь то за один раз или за несколько приемов, но сразу всей, естественно будет тормозить. Раз у тебя cgi скрипт, то в нем и прочитал кусок файла, выдал в браузер, внизу подписал линейку с циферками, перейти к куску два. Нажали на ссылку скрипт получил эту циферку вывел второй кусок (т.е всю страницу заново с новым куском) и т.п
andrew2008 Код (Text): /** *** bigtest.c **/ #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <string.h> #include <limits.h> #include <qtp.h> #define cgiPrintf(...) printf(__VA_ARGS__) #define cgiWrite(str, len) fwrite(str, len, 1, stdout) int cgiInit() { return 0; } int cgiMain() { FILE *fp; cgiHeaderContentType("text/plain"); fp = fopen("/www/.../russian.dic", "rb"); if (fp != NULL) { char *text; size_t size; fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); text = (char *)malloc(size); if (text != NULL) { fread(text, 1, size, fp); cgiWrite(text, size); free(text); } fclose(fp); } } /* [EOF] */ Нормально отдаются большие файлы (>2 MB) проверенно на IE7. P.S. Задача-то в общем-то децкая.
Сейчас честно говоря попробовать не могу, но я сделал тоже самое только на c++. то есть узнал размер файла и вытащил его весь с помощью ifstream::read в string, а потом просто сделал cout этой строке. С cgiWrite не знаком но думаю что она работает не быстрее чем cout, хотя опять таки повторюсь не проверял. И мне надо проделать это на файле в 10Мб а не 2.
andrew2008 Поддерживаю keYMax Если это будет на общедоступном сервере, то учитывай и тех у кого низкая скорость инета, а для них 10М файл одним куском будет полюбому большой геморой, даже если браузер нормальный Да и для тех у кого быстрый, но не дешёвый инет гораздо приятнее глянув первую страницу решить нужны ему эти 10М или ну их..., чем выкидывать трафик впустую. Стоит ещё добавить ссылку - скачать весь файл в архиве - тогда для всех будет гуд
andrew2008 Я ес-но проверял и на 10 мегах, если чо. btw, (f)write быстрее cout. Может предоставите свой креатифф, так чиста поглумицо?
Вы знаете я честно говоря плохо понимаю Вашу манеру общения? Но если Вы "чиста любите поглумиццо" то вот специально для Вас: Код (Text): std::ifstream in; ... 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); std::cout<<"<pre>"; std::cout<<str; std::cout<<"</pre>"; Файл qtp.h не находится по крайне мере в библиотеке Visual Studio 6.
А не подскажете еще как можно реализовать чтобы показывать полные фрагменты текста при считывании? То есть например я прочитаю часть файла вместе с незаконченным предложением или обрубленным словом. Как лучше реализовать чтобы прочитывал всегда законченные слова хотя бы?
Всем огромное спасибо!!! У меня небольшая проблема, при переходе между страницами текст выдается не совсем корректно, то есть на второй странице выдается не продолжение первой??? Если у кого есть время, посмотрите пожалуйста. Я читаю по 102400 байт. void readAndDisplayContent( std::ifstream& in ) { short start = time( NULL ); std::string str; in.seekg( 0, std::ios_base::end); std::ifstream::pos_type len = in.tellg(); size_t readPart = 102400; size_t count = len / readPart; if( len % readPart != 0 ) ++count; char* queryStr = getenv( "QUERY_STRING" ); size_t index = 0; if( queryStr != NULL ) index = strtol( queryStr + 4 , NULL , 10 ); str.resize( readPart ); in.seekg( index * readPart , std::ios_base::beg); in.read( (char*)str.data() , readPart ); for( size_t ind = 0; ind < count; ++ind ) { if( index == ind ) std::cout<<ind + 1<<" "; else std::cout<<"<a href=\"programm.exe?ind="<<ind<<"\">"<<ind + 1<<"</a> "; } std::cout<<"<pre>"; std::cout<<str; std::cout<<"</pre>"; short end = time( NULL ); //std::cout<<"\n\n\nTIME="<<(end - start); }
А зачем читать то из файла блоками? Считывай весь файл в string и выводи его подстроками от .!? до .!? найденными в окрестностях шага индекса 102400.
Так быстрее работает на мой взгляд? Но наверно придеться сделать так как Вы сказали? Не могу найти проблему почему у меня блоками не получается. Спасибо!