从文本文件中读取符号?

时间:2014-05-21 16:03:24

标签: char pascal

10
Balta          B 1 15
Melyna         M 2 15
Zalia          Z 3 12
Raduona        R 4 10
Geltona        G 5 10
Violetine      V 6 12
Pilka          P 7 10
Oranzine       O 8 12
Alyvuogiu      A 9 12
Juoda          J 10 10
3 5
Andrius        B 4 P 7 R 4 B 1 V 6
Tomas          V 6 A 9 B 6 O 8 P 2
Evelina        R 4 P 7 R 4 P 7 B 1


program Spalvotos_korteles;
 type Spalvos = record
       SPav : string[15];            // SpalvosPavadinimas
       SNr, SSk : integer;          //  SpalvosNumeris, SpalvosSkaicius
       SI : char;                  //   SpalvuIndeksas
      end;
      Mokiniai = record
       V : string[15];             // Mokinio vardas
       MI : char;                 //  Mokinio istrauktas indeksas
       Mnr, TR, NR : integer;            //   Mokinio uzrasytas numeris   TeisingiRasymai, NeteisingiRasymai
      end;
 Mas  = array[1..100] of Spalvos;
 Mas1 = array[1..100] of Mokiniai;
 Mas2 = array[1..100] of char;
 Mas3 = array[1..100] of integer;

  var n, Q, MokSk, MokT  : integer;
      S : Mas;
      M : Mas1;
      VI : Mas2;          // Visi Indeksai
      VNr, Istraukta, TeisingiRasymai, Nepanaudota : Mas3;         // VNr - Visi Numeriai

 procedure Nuskaitymas;
  var df : text;
      Qq, i, j, z, ii : integer;
  begin
   Qq:=1;
   assign(df,'duom.txt');
   reset(df);
   readln(df, n);
    for i:= 1 to n do
     readln(df, S[i].SPav, S[i].SI, S[i].SNr, S[i].SSk);

     readln(df, MokSk, MokT);
     for j := 1 to MokSk do
      begin
       read(df,M[j].V);
        for z := 1 to MokT do
         begin
          read(df, M[z].MI, M[z].Mnr);
             VI[Qq] := M[z].MI;
             VNr[Qq] := M[z].Mnr;
           Qq:=Qq+1;
            for ii := 1 to n do
             if (M[z].MI = S[ii].SI) and (M[z].Mnr = S[ii].SNr) then  M[j].TR := M[j].TR+1;


           end;
          end;

         Q:=Qq-1;
         close(df);
      end;

  procedure Uzrasymai_ant_korteliu;
   var i, j : integer;
    begin
       for i:= 1 to n do
        begin
         for j:= 1 to Q do
          begin
           if S[i].SI = VI[j] then
            Istraukta[i]:=Istraukta[i]+1;
           if (S[i].SI = VI[j]) and (S[i].SNr = VNr[j]) then
            TeisingiRasymai[i]:= TeisingiRasymai[i]+1;
          end;
           Nepanaudota[i]:= S[i].SSk - Istraukta[i];
          end;
    end;

  procedure Rezultatas;
   var i, j : integer;
       Rf : text;
    begin
     assign(rf,'SpalvuRezultas.Txt');
     rewrite(rf);
      for i := 1 to MokSk do
       writeln(rf,M[i].V, M[i].TR);
       writeln(rf);
      for j := 1 to n do
       writeln(rf,S[j].SPav, Istraukta[j], TeisingiRasymai[j], Nepanaudota[j]);
      close(rf);
    end;
   begin
    Nuskaitymas;
    Uzrasymai_ant_korteliu;
    Rezultatas;
   end.

我的目标是阅读最后3条道路并查看符号中有多少数字是正确的(正确的是符号和列中的第一个数字)但是当我尝试阅读时,我得到106错误的数字格式。我以某种方式理解问题是因为char符号,但我不知道如何解决它。有人能帮助我吗?

2 个答案:

答案 0 :(得分:0)

主要想法是找出程序如何解释程序中的read语句。

设ch,ch1,ch2 ......为char和int,int1,int2 ...为整数。

INPUT:

P 1 C 2

执行read(ch, int)

RESULT:

ch = P
int = 1

完美无缺。

让我们将其扩展为阅读四个元素。

INPUT:

P 1 C 2

执行read(ch1, int1, ch2, int2)

RESULT:

ch1 = P
int1 = 1
ch2 = C
int2 = 2

然而,

INPUT:

P 1 C 2

执行read(ch1, int1); read(ch2, int2);

RESULT:

ch1 = P
int1 = 1
ERROR 106 when execute read(ch2, int2);

为什么?

让我们看看下图。

reading ch1

1234567
P 1 C 2
^

第一个读取(ch1,int1)要求程序读取一个char,然后读取一个整数,由SPACE分隔。程序首先读取一个char并将指针移动到位置2,然后知道它是一个SPACE,所以继续读取下一个int,将指针移动到位置3。

reading int1

1234567
P 1 C 2
  ^

因此它将1读入int1。并将指针移动到下一个位置。然后第一个read完成。

1234567
P 1 C 2
   ^

发生了什么?第二个read将读取位置4上的字符,这是一个空格。它不会发出任何警告,因为它确实是一个角色。之后指针的位置应该在位置5上。

1234567
P 1 C 2
    ^

程序不会跳过位置5,因为它不是SPACE。因此,' C'被读入int2。作为' C'不是整数,程序发出RUNTIME ERROR 106。

似乎readln(df, S[i].SPav, S[i].SI, S[i].SNr, S[i].SSk);read(df,M[j].V);read(df, M[z].MI, M[z].Mnr);具有相同的逻辑,但在执行中,它们没有。

此外,在您通过readln(df);读取行中的所有元素后,您必须转到下一行。


仅供参考,以下是经过编辑的代码:

program post;

type
    Spalvos = record
        SPav: string[15];            // SpalvosPavadinimas
        SNr, SSk: integer;          //  SpalvosNumeris, SpalvosSkaicius
        SI: char;                  //   SpalvuIndeksas
    end;

    Mokiniai = record
        V: string[15];             // Mokinio vardas
        MI: char;                 //  Mokinio istrauktas indeksas
        Mnr, TR, NR: integer;
        //   Mokinio uzrasytas numeris   TeisingiRasymai, NeteisingiRasymai
    end;
    Mas = array[1..100] of Spalvos;
    Mas1 = array[1..100] of Mokiniai;
    Mas2 = array[1..100] of char;
    Mas3 = array[1..100] of integer;

var
    n, Q, MokSk, MokT: integer;
    S: Mas;
    M: Mas1;
    VI: Mas2;          // Visi Indeksai
    VNr, Istraukta, TeisingiRasymai, Nepanaudota: Mas3;         // VNr - Visi Numeriai
    temp: char;

    procedure Nuskaitymas;
    var
        df: Text;
        Qq, i, j, z, ii: integer;
    begin
        Qq := 1;
        Assign(df, 'duom.txt');
        reset(df);
        readln(df, n);
        for i := 1 to n do
            readln(df, S[i].SPav, S[i].SI, S[i].SNr, S[i].SSk);
        readln(df, MokSk, MokT);
        for j := 1 to MokSk do
        begin
            Read(df, M[j].V);
            for z := 1 to MokT do
            begin
                Read(df, M[z].MI, M[z].Mnr, temp);
                writeln(M[z].MI, M[z].Mnr);
                VI[Qq] := M[z].MI;
                VNr[Qq] := M[z].Mnr;
                Qq := Qq + 1;
                for ii := 1 to n do
                    if (M[z].MI = S[ii].SI) and (M[z].Mnr = S[ii].SNr) then
                        M[j].TR := M[j].TR + 1;
            end;
            readln(df);
        end;
        Q := Qq - 1;
        Close(df);
    end;

    procedure Uzrasymai_ant_korteliu;
    var
        i, j: integer;
    begin
        for i := 1 to n do
        begin
            for j := 1 to Q do
            begin
                if S[i].SI = VI[j] then
                    Istraukta[i] := Istraukta[i] + 1;
                if (S[i].SI = VI[j]) and (S[i].SNr = VNr[j]) then
                    TeisingiRasymai[i] := TeisingiRasymai[i] + 1;
            end;
            Nepanaudota[i] := S[i].SSk - Istraukta[i];
        end;
    end;

    procedure Rezultatas;
    var
        i, j: integer;
        Rf: Text;
    begin
        Assign(rf, 'SpalvuRezultas.Txt');
        rewrite(rf);
        for i := 1 to MokSk do
            writeln(rf, M[i].V, M[i].TR);
        writeln(rf);
        for j := 1 to n do
            writeln(rf, S[j].SPav, Istraukta[j], TeisingiRasymai[j], Nepanaudota[j]);
        Close(rf);
    end;

begin
    Nuskaitymas;
    Uzrasymai_ant_korteliu;
    Rezultatas;
end.

答案 1 :(得分:0)

感谢您的回答,但我已经了解了char阅读空间并修复了它。不知道这是否是最好的方式,但它有效。

 readln(df, MokSk, MokT);
 for j := 1 to MokSk do
  begin

   read(df,M[j].V);
      for z := 1 to MokT-1 do
     begin
      read(df, MI, Mnr, Tuscias);                //  M[z].MI P      M[z].Mnr O
       VI[Qq] := MI;
         VNr[Qq] := Mnr;
         Qq:=Qq+1;
          for ii := 1 to n do
         if (MI = S[ii].SI) and (Mnr = S[ii].SNr) then  M[j].TR := M[j].TR+1;
        end;
         read(df, MI, Mnr);
           VI[Qq] := MI;
           VNr[Qq] := Mnr;
           Qq:=Qq+1;
          for ii := 1 to n do
         if (MI = S[ii].SI) and (Mnr = S[ii].SNr) then  M[j].TR := M[j].TR+1;
          readln(df);
        end;

Andrius        B 4 P 7 R 4 B 1 V 6
Tomas          V 6 A 9 B 6 O 8 P 2
Evelina        R 4 P 7 R 4 P 7 B 1

我不知道其他任何阅读此程序的方法,所以我就是这样做的。

P.S。我之前尝试过你的方式,但它没有工作,因为在最后一对之后没有空间,程序会出错。但谢谢你的帮助,先生:)