На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Чтение файла в массив
    Бодрого дня, господа знатоки.
    Придумал себе такую проблему - чтобы выборочно файл читать не как все, а потом выводить это на экран.
    А "загоняя" его построчно в массив и затем в нужный момент выводить необходимые строки (индексы массива).

    Так вот вопрос - целесообразно ли это при количестве строк больше 1 500?
    К стати, я сделал вот так:
    ExpandedWrap disabled
      program proba;
      uses crt;
      var
          f: text;
          mas:array [1..25] of string;
          a,b,i:integer;
      begin
      repeat
          write('ввести а: '); readln(a);
          write('ввести b: '); readln(b);
          assign (f, 'inf.txt');
          reset (f);
          for i:=1 to 25 do
              readln(f,mas[i]);
          for i:=a to b do
              writeln(mas[i]);
          close (f);
      until (a=0) or (b=0);
      end.

    Может и подскажете как это правильнее и красивее сделать?
      Цитата camac @
      Может и подскажете как это правильнее и красивее сделать?


      Чтение в память - это прямое использование ресурсов. А если файл содержит 2Tb текста? В общем случае - лучше прочесть файл, но не загружать сами строки, а загружать их индексы. Грубо говоря, смещение n-ой строки от начала. Длина строки высчитывается как разница смещений n+1 (или конца файла) минус n. Но и тут следует учесть, и индексов может быть много, тогда писать их в индексный файл. Соответственно вывод нужной строки будет осуществлен в два этапа: бинарное чтение двух индексов по смещению + бинарное чтение самой строки.

      ... Но если в файле 15 строк, тогда не париться, а читать все в память.
      Мои программные ништякиhttp://majestio.info
        Я не совсем правильно свой оборзец написал. Или совсем неправильно...
        По идее надо так:
        ExpandedWrap disabled
              program proba;
              uses crt;
              var
                  f: text;
                  mas:array [1..25] of string;
                  a,b,i:integer;
              begin
                  assign (f, 'inf.txt');
                  reset (f);
                  for i:=1 to 25 do
                      readln(f,mas[i]);
              repeat
                  write('ввести а: '); readln(a);
                  write('ввести b: '); readln(b);
                  for i:=a to b do
                      writeln(mas[i]);
                  close (f);
              until (a=0) or (b=0);
              end.

        Меня интересует - 3-4 тыс строк - это много или нет?

        Цитата

        лучше прочесть файл, но не загружать сами строки, а загружать их индексы. Грубо говоря, смещение n-ой строки от начала. Длина строки высчитывается как разница смещений n+1 (или конца файла) минус n. Но и тут следует учесть, и индексов может быть много, тогда писать их в индексный файл.

        А чуть подробней об этом узнать/почитать можно? Или Вы кратко объясните?
          А какая цель вообще стоит? И почему для реализации выбран турбопаскаль?
            Цитата camac @
            Меня интересует - 3-4 тыс строк - это много или нет?


            В нынешних реалиях используемой техники - это пыль. Расчет нехитрый. Берем самый бюджетный комп с 2Gb оперативы, со слегка "нафаршированной" виндой. Физической памяти там займется 1-1.2Gb. Мои сугубо личные наблюдения показывают, что винда начинает подтупливать, когда занимается 80% и более физической памяти. Таким образом, примерно 400Мб мы можем "откусить" под закачку строк. Если взять самые длинные паскалевско-родные строки, то получим 400*1024*1024/256 = 1 638 400 строки мы можем загрузить. Соответственно, ответ на вопрос 3-4к строк - это немного.

            Цитата camac @
            А чуть подробней об этом узнать/почитать можно? Или Вы кратко объясните?

            Объясню на примере. Пусть дан текст c окончанием строк в формате DOS-Windows "перевод строки+возврат каретки" 0D0A:

            Мама мыла раму.(0d0a)Рама(0d0a)задолбала маму.
            ^....................^.........^..............
            0                   17        23

            Таким образом, считывая поблочно ищем все концы строк, строя индексный массив (грубо говоря - смещения строк относительно начала). Должен получиться такой (0,17,23). Теперь им пользуемся следующим образом ...
            1. Получение содержимого нулевой строки: в файле, открытом в бинарном режиме двигаем указатель на 0, считываем 17-0-2 символов (-2, т.к. концовки строк нам не нужны), получим подстроку длиной 15.
            2. Получение содержимого первой строки: в файле, открытом в бинарном режиме двигаем указатель на 17, считываем 23-17-2 символов (аналогично, -2, т.к. концовки строк нам не нужны), получим подстроку длиной 4.
            3. Получение содержимого третьей (последней) строки: в файле, открытом в бинарном режиме двигаем указатель на 23, считываем L-23 символов (в конце файла перевода строки нет, значит 2 не отнимаем), получим подстроку длиной 15, где L==38 - длина файла.
            Мои программные ништякиhttp://majestio.info
              Цитата MBo
              почему для реализации выбран турбопаскаль?

              Вообще то FreePascal. Турбо в Линуксе проблематичен.
                Думаю, во FreePascal-е есть TStringList. Для файлов умеренного размера (скажем, до сотни-другой мегабайт) это будет удобнее.
                  Цитата MBo @
                  Думаю, во FreePascal-е есть TStringList.

                  Есть.
                  Долог путь в бессмертие... я еще вернусь.
                  Профильный скилл "Телепатия" 8%
                  ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
                  Прошу потестить игру.
                    Цитата
                    Так вот вопрос - целесообразно ли это при количестве строк больше 1 500?

                    нет, не целесообразно
                      Научным методом было бы задать количество строк переменной, и всю прогу писать относительно её, чтобы можно было бы меняя одно значение попробовать разные варианты. Можно даже локально порождать тестовые строки самой программой и смлтреть не станет ли работа некомфортной
                        Да, согласен. Сам так же делал
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script Execution time: 0,1750 ]   [ 14 queries used ]   [ Generated: 16.10.19, 09:31 GMT ]