Ошибка при поиске определенного символа в определенном индексе строки из текстового файла (при подсчете абзацев в текстовом файле) - PullRequest
0 голосов
/ 04 июля 2019

У меня проблема с поиском определенных символов в текстовом файле. Проблема исходит от задачи подсчета абзацев в текстовом файле. Идея очевидна - два абзаца в текстовом файле разделены пустой строкой, это означает, что первый символ в этой строке - ASCII # 13, поэтому, если я сделаю процедуру, которая проходит через

Идея очевидна - два абзаца в текстовом файле разделены пустой строкой, это означает, что первый символ в этой строке - ASCII # 13, поэтому, если я сделаю процедуру, которая проходит через каждую строку в текстовом файле, и если первый символ в строке - ASCII # 13, затем счетчик увеличивается на 1. Но когда я это делаю, я получаю внешнюю ошибку SIGSEGV в строке, когда я запускаю программу. Это код -

procedure paragraphs(name:string) ;
var
line:string;
paragraphs:integer;
file:textfile
begin
assignfile(file, name)     ;
reset(file);
paragraphs:=0;
while not eof(file) do
   begin
     readln(file,line);
     if line[1]=#13  then     //here is the error
     paragraphs:=paragraphs+1;
   end;
end; 

Теперь, что странно, так это то, что у меня очень похожая процедура, которая подсчитывает общее количество слов, работает на той же основе и работает без ошибок

procedure words(name:string);
var 
insideword:boolean  ;
x,words:integer;
file:textfile;
line:string;
begin
assignfile(file, name);
reset(file);
words:=0;
while not eof(file) do
begin
  insideword:=false;
readln(file,line);
for x:=1 to length(line) do
begin
if line[x]=' ' then insideword:=false   //no problem here
else begin
if insidewords=false then words:=words+1;
insidewords:=true;
end;
end;
end;
end;

Я думал, что строки - это в основном массивы char, но я думаю, что строки, являющиеся динамическими массивами, в этом случае не позволяют мне использовать определенный индекс, хотя в основном это работает в процедуре Words, и я использую ту же идею - поиск динамический массив для конкретного символа. Но здесь мне нужно искать конкретный символ в первом указателе строки. Почему вышеупомянутые параграфы процедуры не работают? Любые идеи о том, как исправить процедуру, чтобы она отображала количество абзацев в текстовом файле?

1 Ответ

0 голосов
/ 04 июля 2019

Вы делаете это неправильно.

ReadLn не возвращает символы конца строки, поэтому, когда вы пытаетесь получить доступ к первому символу пустой строки, вы получаетенарушение доступа, потому что нет «первого» символа для доступа через Line[1].Если вы действительно хотите получить доступ к файлу за символом, используйте Read() вместо ReadLn().

Для поиска по строке в соответствии с заголовком вашего q используйте функцию Pos() дляискать строку для символа или подстроки.См. OLH для использования.

...