Отображение больших файлов в IE

Тема в разделе "LANGS.C", создана пользователем andrew2008, 20 окт 2008.

  1. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    В дополнение к предыдущей задаче. Прошу прощения у модераторов, но теперь проблема немного в другом, поэтому создал дополнительную тему.
    Изначально, у меня стояла задача прочитать и отобразить файл размеров 10 Мб в браузере IE7.
    То есть должна быть программка для вызова ее как cgi скрипт.
    Я программку написал, под opera все отлично работает и отображает документ полностью секунд за 5.
    То есть я вытащил весь файл разом и вывел его в pre тегах.
    С IE7 проблема, документ отображается медленно. То есть начальная загрузка большей части документа быстрая,
    но потом он еще долго выдает, фактически построчно, оставшуюся часть файла.
    А мне надо чтобы можно было с помощью скроллинга IE перейти в конец и увидеть конец документа(из файла).

    По крайней мере так стоит задача?
    Помогите, пожалуйста, кто знает как можно это осуществить???
    Заранее благодарен за помощь!!!
     
  2. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Разбить на много страниц, столько грузить в браузер не есть хорошо.
     
  3. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    А как это программно сделать?
    Я считал весь файл в std::string.
    Я пытался выводить этот string частями по 0.2Мб, быстрее все равно не стало.
    Наверно как то можно запрограммировать реагирование на события скроллинга IE7 и при скроллинге выдавать примерно содержимое из этого string и одновременно выводить весь этот string в браузер?
    Только я не знаю как это сделать и не уверен что это вообще можно сделать? По крайней мере одновременно показывать часть текста по скроллингу и выводить все содержимое в браузер?
     
  4. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    В любом случае вывод сразу столькой инфо в IE всей вместе, будь то за один раз или за несколько приемов, но сразу всей, естественно будет тормозить.

    Раз у тебя cgi скрипт, то в нем и прочитал кусок файла, выдал в браузер, внизу подписал линейку с циферками, перейти к куску два. Нажали на ссылку скрипт получил эту циферку вывел второй кусок (т.е всю страницу заново с новым куском) и т.п
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    andrew2008
    Код (Text):
    1. /**
    2. *** bigtest.c
    3. **/
    4.  
    5. #include <stdio.h>
    6. #include <stdlib.h>
    7. #include <stddef.h>
    8. #include <string.h>
    9. #include <limits.h>
    10. #include <qtp.h>
    11.  
    12. #define cgiPrintf(...)          printf(__VA_ARGS__)
    13. #define cgiWrite(str, len)      fwrite(str, len, 1, stdout)
    14.  
    15. int cgiInit() {
    16.   return 0;
    17. }
    18.  
    19. int cgiMain() {
    20.   FILE *fp;
    21.   cgiHeaderContentType("text/plain");
    22.   fp = fopen("/www/.../russian.dic", "rb");
    23.   if (fp != NULL) {
    24.     char *text;
    25.     size_t size;
    26.  
    27.     fseek(fp, 0, SEEK_END);
    28.     size = ftell(fp);
    29.     fseek(fp, 0, SEEK_SET);
    30.  
    31.     text = (char *)malloc(size);
    32.     if (text != NULL) {
    33.       fread(text, 1, size, fp);
    34.       cgiWrite(text, size);
    35.       free(text);
    36.     }
    37.  
    38.     fclose(fp);
    39.   }
    40. }
    41.  
    42. /* [EOF] */
    Нормально отдаются большие файлы (>2 MB) проверенно на IE7.

    P.S. Задача-то в общем-то децкая.
     
  6. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    Сейчас честно говоря попробовать не могу, но я сделал тоже самое только на c++. то есть узнал размер файла и вытащил его весь с помощью ifstream::read в string, а потом просто сделал cout этой строке.
    С cgiWrite не знаком но думаю что она работает не быстрее чем cout, хотя опять таки повторюсь не проверял.
    И мне надо проделать это на файле в 10Мб а не 2.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    andrew2008
    Поддерживаю keYMax
    Если это будет на общедоступном сервере, то учитывай и тех у кого низкая скорость инета, а для них 10М файл одним куском будет полюбому большой геморой, даже если браузер нормальный ;)
    Да и для тех у кого быстрый, но не дешёвый инет гораздо приятнее глянув первую страницу решить нужны ему эти 10М или ну их..., чем выкидывать трафик впустую.
    Стоит ещё добавить ссылку - скачать весь файл в архиве - тогда для всех будет гуд ;)
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    andrew2008
    Я ес-но проверял и на 10 мегах, если чо. btw, (f)write быстрее cout.

    Может предоставите свой креатифф, так чиста поглумицо? :)
     
  9. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    Вы знаете я честно говоря плохо понимаю Вашу манеру общения?
    Но если Вы "чиста любите поглумиццо" то вот специально для Вас:
    Код (Text):
    1.   std::ifstream in;
    2.  ...
    3.   in.seekg( 0, std::ios_base::end);
    4.   std::ifstream::pos_type len = in.tellg();
    5.   in.seekg( 0 );
    6.   str.resize( len);
    7.   in.read( (char*)str.data(), len);
    8.   std::cout<<"<pre>";
    9.   std::cout<<str;
    10.   std::cout<<"</pre>";
    Файл qtp.h не находится по крайне мере в библиотеке Visual Studio 6.
     
  10. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    А не подскажете еще как можно реализовать чтобы показывать полные фрагменты текста при считывании?
    То есть например я прочитаю часть файла вместе с незаконченным предложением или обрубленным словом.
    Как лучше реализовать чтобы прочитывал всегда законченные слова хотя бы?
     
  11. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Между словами обычно бывают пробелы. (Код 0x20)
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    andrew2008
    Но лучше всё-таки найти точку, завершающую предложение ;)
     
  13. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Предложение может оканчиваться ! или ?
     
  14. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    Всем огромное спасибо!!!
    У меня небольшая проблема, при переходе между страницами текст выдается не совсем корректно, то есть на второй странице выдается не продолжение первой:)???
    Если у кого есть время, посмотрите пожалуйста.
    Я читаю по 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);
    }
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А зачем читать то из файла блоками?
    Считывай весь файл в string и выводи его подстроками от .!? до .!? найденными в окрестностях шага индекса 102400.
     
  16. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    Так быстрее работает на мой взгляд? Но наверно придеться сделать так как Вы сказали? Не могу найти проблему почему у меня блоками не получается.
    Спасибо!