Как подсчитать количество строк в текстовом файле?

spoiler
program point;
Type Orehi = class // Создаём тип данных хранящий в себе координаты
public
    z,y : string;
    x:integer;  // Задаём координатам типы данных, создаём конструктор и процедуры
    constructor Create(z2,y2: string;x2: integer);
    constructor Create(b:Orehi);
End;
 
constructor Orehi.Create(z2,y2: string;x2: integer); // Описываем работу конструктора и процедурQ
begin
    z :=z2;
    x := x2;
    y := y2;
end;
 
constructor Orehi.Create(b:Orehi); // Описываем работу конструктора и процедур
begin
    z :=b.z;
    x :=b.x;
    y :=b.y;
end;
 
function Ins (z3,y3: string; x3: integer): Orehi ;
  var c:Orehi;
  begin
  if (length(z3)<>0) and (x3 > 0) and (length(y3)<>0) then begin
    c:=new Orehi(z3,y3,x3);
    Ins:=c;
    end
  else begin
    Writeln(('Введены неправильные данные'));
    end;
end;
 
procedure InsInMas (a:array of Orehi;n:integer);
var name1,cst: string;
    cp,i: integer;
begin
  for i:=0 to n do begin
    Writeln(('Введите название орехов'));
    readln(name1);
    Writeln(('Введите регион происхождения'));
    readln(cst);
    Writeln(('Введите цену за 1 кг'));
    readln(cp);
    a[i]:=Ins(name1,cst,cp);
  end;
end;
 
procedure SortByOne(a:array of Orehi;n:integer);
  var tmp:Orehi;
  i,j: integer;
begin
  for i:=0 to n do begin
    for j:=0 to n-i-1 do begin
      if a[j].z>a[j+1].z then begin
        tmp := a[j];
        a[j] := a[j+1];
        a[j+1] := tmp;
      end;
    end;
  end;
end;
 
procedure SortByTwo(a:array of Orehi;n:integer);
  var tmp:Orehi;
  i,j: integer;
begin
  for i:=0 to n do begin
    for j:=0 to n-i-1 do begin
      if a[j].x>a[j+1].x then begin
        tmp := a[j];
        a[j] := a[j+1];
        a[j+1] := tmp;
      end;
    end;
  end;
end;
 
procedure FindSmth(a:array of Orehi;n:integer;var s:Array of Orehi);
  var
    i,sr,count,p: integer;
  begin
    sr:=0;
    count:=0;
    p:=0;
    for i:=0 to n do begin
      sr:=sr+a[i].x;  
    end;
    sr:=sr div n;
    for i:=0 to n do begin
      if sr>a[i].x then begin
        count:=count+1;
        end
    end;
    SetLength(s,count);
    for i:=0 to n do begin
        if a[i].x <sr then begin
            s[p]:=a[i];
            p:=p+1;
        end
    end;
end;

procedure WriteInFile(a:array of Orehi;n:integer;Fi:string);
var
    file2: Text;
    i: integer;
begin
    Assign(file2,Fi);
    Rewrite(file2);
    for i:=0 to n do begin
        Writeln(file2,a[i].z,' ',a[i].y,' ',a[i].x);
    Close(file2);
    end;
end;

function ReadFromFile(Fi:string): array of Orehi;
var
    f: Text;
    i,count,count2,x2: integer;
    s:string;
    a:array of Orehi;
begin
    count2:=1;
    Assign(f,Fi);
    Reset(f);
    While not eof(f) do begin
        Readln(f,s);
        WriteLn(s);
        count:=count+1;
    SetLength(a,count);
    Reset(f);
    WriteLn(count);
    for i:=0 to count-1 do begin
        while not eoln(f) do begin
            Read(f,s);
            WriteLn(s);
            if count2=1 then begin
                a[i].z:=s;
            end ;
            if count2=2 then begin
                a[i].y:=s;
            end;
            if count2=3 then begin
                x2:=StrToInt(s);
                a[i].x:=x2;
            end;
            count2:=count2+1;
        end;
        count2:=1;
    end;
    Close(f);
    ReadFromFile:=a;
end;
end;

procedure FindSmthFile(Fi:string;Fi2:string);
var
    a:array of Orehi;
    s:array of Orehi;
begin
    a:=ReadFromFile(Fi);
    FindSmth(a,length(a),s);
    WriteInFile(s,length(s),Fi2);
end;

procedure CoutMas (a:array of Orehi;n:integer);
var
  ans: Array of Orehi;
  i,j: integer;
  ss:string;
begin
  writeln(('Что нужно вывести:'));
  writeln(('Начальный массив: 1'));
  writeln(('Массив после первой сортировки:2'));
  writeln(('Массив после второй сортировки:3'));
  writeln(('Результат функции поиска:4'));
  writeln(('Данные, которые будут записаны в файл:5'));
  writeln(('Массив, который получился выписыванием данных из файла:6'));
  writeln(('Результат функции поиска в файле:7'));
  read(j);
  case j of
  1:
    for i:=0 to n do begin
      Writeln(a[i].z,' ',a[i].y,' ',a[i].x);
    end;
  2:
  if j=2 then begin
    SortByOne(a,n);
      for i:=0 to n do begin
        Writeln(a[i].z,' ',a[i].y,' ',a[i].x);
      end;
   end;
  3:
  if j=3 then begin
    SortByTwo(a,n);
    for i:=0 to n do begin
      Writeln(a[i].z,' ',a[i].y,' ',a[i].x);
    end; 
  end;
  4:
  if j=4 then begin 
    FindSmth(a,n,ans);
    if (length(ans)=0) then begin
      Writeln(('Подходящих значений нет'));
    end
    else begin
      for i:=0 to length(ans) do begin
        Writeln(ans[i].z,' ',ans[i].y,' ',ans[i].x);
        end;
    end;
  end;
  5:
    for i:=0 to n do begin
      Writeln(a[i].z,' ',a[i].y,' ',a[i].x);
    end;
  6:
    if j=6 then begin
      WriteLn(('Введите название и расширение файла'));
      Readln(ss);
      ans:=ReadFromFile(ss);
      for i:=0 to length(ans) do begin
        Writeln(ans[i].z,' ',ans[i].y,' ',ans[i].x);
      end;
    end;
  7:
    if j=7 then begin 
      FindSmth(a,n,ans);
      if (length(ans)=0) then begin
        Writeln(('Подходящих значений нет'));
      end
      else begin
        for i:=0 to length(ans) do begin
          Writeln(ans[i].z,' ',ans[i].y,' ',ans[i].x);
        end;
      end;
    end;
  else begin
  writeln(('Введён неправильный номер'));  
  end;
end;
end;

 
var //Оснавная часть программы
    b1: array of Orehi; // Приводим массивы к собственному типу данных
    b2: array of Orehi;
    tmp: Orehi; // Временная переменная для сортировки
    i ,j, N,vv: integer; // Объявляем переменные
    ss,s2,s3: string;
begin
writeln(('Введите количетсво видов орехов')); //Ввод стартовых значений
readln(N);
SetLength(b1,N);//Создание размеров массива
SetLength(b2,N);
tmp:= new Orehi();// Задаём значения для временной переменной
N:=N-1; // Исключаем

vv:=1;
ss:='';
while vv <>0 do begin
  writeln(('Меню значений'));
  writeln(('Вывода массива и всех процедур на экран: 1'));
  writeln(('Заполнение массива:2'));
  writeln(('Сортировка массива по первому признаку:3'));
  writeln(('Сортировка массива по второму признаку:4'));
  writeln(('Поиск:5'));
  writeln(('Записать массив в файл:6'));
  writeln(('Прочитать значения из файла в массив:7'));
  writeln(('Поиск в файле:8'));
  writeln(('Окончание программы:0'));
  readln(vv);
  case vv of
  1:
    CoutMas(b1,N);
  2:
    if vv=2 then begin
      InsInMas(b1,N);
      b2:=b1;
    end;
  3:
    SortByOne(b1,N);
  4:
    SortByTwo(b1,N);
  5:
    FindSmth(b1,N,b2);
  6:
  if vv=6 then begin
    WriteLn(('Введите название и расширение файла'));
    Readln(s2);
    WriteInFile(b1,N,s2)
  end;
  7:
  if vv =7 then begin
    WriteLn(('Введите название и расширение файла'));
    Readln(s2);
    b2:=ReadFromFile(s2);
  end;
  8:
  if vv =8 then begin
    WriteLn(('Введите название и расширение файла в котором нужно искать'));
    Readln(s2);
    WriteLn(('Введите название и расширение файла в котором нужно записать'));
    Readln(s3);
    FindSmthFile(s2,s3);
  end;
end;
end;
end.


Если создать текстовый файл с несколькими элементами, наример :
keshm turkish 2000
arahis gre 900
funduk  italy 1000
То, процедура чтения файла, возвращает только первую строку, после чего выдаёт ошибку: ссылка на обьект не указывает на экземпляр объекта.
  • Вопрос задан
  • 239 просмотров
Решения вопроса 1
HemulGM
@HemulGM Куратор тега Delphi
Delphi Developer, сис. админ
Приведенный код не понятно для чего, а подсчитать строки можно так (если их не много)

var LinesCount: Integer;
var List: TStringList;
try
  List.LoadFromFile('filename.txt');
  LinesCount := List.Count;
finally
  List.Free;
end;
writeln(LinesCount);


или так

writeln(Length(TFile.ReadAllLines('filename.txt')))


или так (можно для большого файла, если длина одной строки не огромная)

var LinesCount := 0;
with TFile.OpenText('filename.text') do
try
  while not EndOfStream do begin ReadLine; Inc(LinesCount); end;
finally
  Free;
end;
Writeln(LinesCount);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@EDIsaev
У тебя проблема в самой функции чтения файла, считать количество строк там не надо, она их считывает по порядку.
Ищи ошибку в ней, начиная с того, что у тебя count уже не инициализированный с самого начала и непонятно зачем после каждой строки ты закрываешь файл и потом открываешь снова, возможно из-за этого снова читаешь ту же строку
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы