Разделить файл пополам по границе строки

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 6 мес., 1 неделя назад.

  • Автор
    Сообщения
  • #3896

    Как разделить текстовый файл файла на два примерно одинаковой длины по границе строки? – т.е. если в файле 4 строки, то в два выходных файла надо записать по две. Если во входном файле 7 строк – то в первый пишем первые 3 строки, во второй – остальные 4.

    Сначала нам надо подсчитать количество строк в файле – сделать это можно с помощью функции line_numbers. Эта функция считает число строк в файле, а в качестве побочного эффекта – перемещает позицию чтения на начало файла. Нам же потребуется считывать строки с начала файла. Чтобы переместить позицию чтения в файле можно использовать встроенную функцию filepos, которая принимает три аргумента:

    1. идентификатор файла;
    2. смещение (в символах);
    3. режим. Поддерживается три режима, задающих точку, относительно которой задается смещение:
      • относительно начала файла;
      • относительно текущей позиции;
      • относительно конца файла.

    Нам нужно поместить указатель чтения на позицию относительно начала файла на ноль символов. Поэтому пишем:

      openread(infile,"f1.txt"), readdevice(infile),
      lines_number(Number), 
      filepos(infile, 0, 0),

    Теперь определим количество строк, которое надо переписать в каждый из двух файлов:
    FirstFileLines = trunc(Number/2),
    SecondFIleLines = Number – FirstFileLines,
    Функция trunc тут используется для округления результата деления вниз.

    Остается переписать из входного файла в выходные нужное число строк и закрыть файлы. Функция write_lines принимает число строк, которое осталось переписать. Если это число равно нулю – завершает работу, иначе считывает первую строку с входного потока и записывает ее в выходной поток, остальные строки обрабатывает рекурсивно:

      write_lines(0):-!.
      write_lines(Number):-
        readln(String),
        write(String), nl,
        TailNumber = Number - 1,
        write_lines(TailNumber).

    Перед работой функции входной и выходной потоки должны быть установлены на нужные нам файлы (если этого не сделать – функция будет считывать данные с клавиатуры и выводить на экран). Использовать эту функцию в нашем случае можно следующим образом:
      openwrite(outfile, "f2.txt"), writedevice(outfile),
      write_lines(FirstFileLines),
      closefile(outfile),
      
      openwrite(outfile, "f3.txt"), writedevice(outfile),
      write_lines(SecondFileLines),
      closefile(outfile),
      
      closefile(infile).

    На скриншоте показан результат работы программы и содержимое файлов.

Для ответа в этой теме необходимо авторизоваться.