Pascal:只显示一组数组,而不显示文件中的其余数组

时间:2017-06-01 03:43:23

标签: pascal freepascal

所以我的代码只从我的文本文件中读取一组专辑,并拒绝阅读文件中的其余部分。出于某种原因,为什么我要阅读相册,它只显示该文件包含" 1"专辑而不是" 2"。即使在我的循环中,我也将SetLength数组等于 albumNumber ,所以数组大小应设置为当我开始我的循环。

文本文件

2 (how many albums)
Adele (name)
Pop (genre)
2 (tracks)
Hello (Track 1)
ff (location)
Remedy (track 2)
dd (location)
Jcole
Rap
2
Toto
ff
Africa
dd

帕斯卡

type
    TrackRec = record
        name: String;
        location: String;
    end;
    GenreType = (Pop, Rap, Rock, Classic);
    AlbumRec = Record
        name: String;
        genre: GenreType;
        tracks: array of TrackRec;
    end;
type AlbumArray = array of AlbumRec; 
procedure ReadAlbum(var albums: AlbumArray; var myFile: TextFile);
var
    albumNumber, tracknumber, count, i: Integer;

begin
    AssignFile(myFile, 'mytestfile.dat');
    Reset(myFile);
    ReadLn(myFile, albumNumber);
    WriteLn('This file contained ', albumNumber, ' album/s');
    SetLength(albums, albumNumber); 

    for i := 0 to High(albums) do
    begin
        ReadLn(myFile, albums[i].name);
        ReadLn(myFile, albums[i].genre);
        ReadLn(myFile, tracknumber);
        SetLength(albums[i].tracks, tracknumber);
        for count := Low(albums[count].tracks) to tracknumber - 1 do
        begin
            ReadLn(myFile, albums[i].tracks[count].name);
            ReadLn(myFile, albums[i].tracks[count].location);
        end;
    end;
end;
procedure Main();
var
    i, count, select, change: Integer;
    albums: AlbumArray;
    myFile: TextFile;
    message: String;
begin

    WriteLn('Please select an option: ');
    WriteLn('-------------------------');
    WriteLn('1. Read Filename');
    WriteLn('2. Display Albums');
    WriteLn('3. Select an Album');
    WriteLn('4. Update an Album');
    WriteLn('5. Exit');
    WriteLn('-------------------------');
    repeat
        i := ReadInteger('Select option for menu:');
        case i of  
            1: ReadAlbum(albums, myFile);

            2: PrintAll(albums, myFile);

            3: PlayAlbum(albums, myFile);

            4: Update(albums, myFile);
        end;
    until i = 5;
end;

1 个答案:

答案 0 :(得分:1)

您的代码包含许多例程(例如PlayAlbum) 没有包括来源。

无论如何,您可能会感到宽慰,实际上您的ReadAlbum程序确实如此 工作正常,但也许你已经陷入混乱,认为它没有。

在下面,我已经解释了你如何调试它 验证它是否有效。现在,请使用以下代码替换您的ReadAlbumMain, 其中还包括一些显示结果的程序。

完成后,请编译并运行该应用程序。

代码:

procedure ReadAlbum(var albums: AlbumArray; var myFile: TextFile);
var
    albumNumber, tracknumber, count, i: Integer;

begin
    AssignFile(myFile, 'D:\Delphi\Code\Lazarus\mytestfile.dat');
    Reset(myFile);
    ReadLn(myFile, albumNumber);
    WriteLn('This file contained ', albumNumber, ' album/s');
    WriteLn;  // To space out the display
    SetLength(albums, albumNumber);

    for i := 0 to High(albums) do
    begin
        ReadLn(myFile, albums[i].name);
        ReadLn(myFile, albums[i].genre);
        ReadLn(myFile, tracknumber);
        SetLength(albums[i].tracks, tracknumber);
        for count := Low(albums[count].tracks) to tracknumber - 1 do
        begin
            ReadLn(myFile, albums[i].tracks[count].name);
            ReadLn(myFile, albums[i].tracks[count].location);
        end;
    end;
end;

procedure PrintAlbum(Albums : AlbumArray; AlbumNumber : Integer);
var
  Tracks : Integer;
  Album : AlbumRec;
begin
  //  Note : This is incomplete, you should complete it yourself!
  //  I've used the local variable Album to avoid having to keep typing
  //  Albums[AlbumNumber] and because it makes inspection during debugging easier
  Album := Albums[AlbumNumber];
  WriteLn('Album number: ', AlbumNumber);
  Writeln('AlbumName: ', Album.Name);
  Writeln('AlbumGenre: ', Album.Genre);
  Writeln;  // to Space out the display;
end;

procedure PrintAlbums(Albums : AlbumArray);
var
  AlbumNumber : Integer;
  Album : AlbumRec;
begin
  for AlbumNumber := 0 to High(Albums) do begin
    Album := Albums[AlbumNumber];
    PrintAlbum(Albums, AlbumNumber);
  end;
end;

procedure Main();
var
  albums: AlbumArray;
  myFile: TextFile;
begin
   ReadAlbum(Albums, MyFile);
   PrintAlbums(Albums);
   WriteLn('Done');
   ReadLn;
end;

begin
  Main;
end.

以下说明如何在免费软件Lazarus中开始调试 FPC的IDE。

1在IDE中打开项目后,在该行上设置调试器断点       对于i:= 0到高(专辑) 通过按 F5 或点击" gutter"中的蓝色圆圈 在编辑器窗口的左侧。无论哪种方式,该线应该变为红色。

2编译并运行应用程序。应出现黑色控制台窗口 然后调试器将停止在步骤1中设置的BP。

3按 Ctrl-F5 。这将弹出一个Watch Properties对话框。 监视是一种让调试器显示变量值的方法 当程序执行时。输入     相册 在Expression框中。

如有必要,请拖动“监视列表”窗口,使其不与代码重叠 编辑器窗口或控制台窗口。

4现在,反复按 F8 并仔细观察Watch List窗口。 F8使调试器一次执行一行代码,称为"单步执行"对于 明显的原因。请注意,监视列表窗口已经知道"有2个专辑记录和那些字段。

当您单步浏览for i:=for count :=时,请注意字段的方式 这两个记录的逐步填写。

顺便说一下,Count对于实际代表的变量来说不是一个好名字 怨恨TrackNumber

5最终,for i:=循环将结束,此时您知道相册数组已正确设置,包括第二张专辑记录。

6一旦您对调试器更加熟悉,就可以删除在步骤1中设置的BP。而是在最后一行ReadAlbums上放置BP。编译并运行应用程序后,它将停止在BP上,以便您可以验证Albums的内容,而无需单步执行两个for循环的每一行。

7现在,完成PrintAlbum的编码。如有必要,您可以按照步骤1-6

进行调试

8搜索在线Lazarus调试教程并阅读它们直到它变得无聊。

希望在您完成所有这些操作之前,您可以更好地了解读者需要提供哪些信息(包括代码)才能提供帮助。关键 获得良好的帮助是让读者能够重现问题,而你的q并没有这样做。读者不应该猜测丢失的代码应该做什么。即使很明显,问题实际上可能会变成你所没有的代码中的某个地方,在这种情况下,读者无论如何都无法提供帮助。