如何从.txt文件中读取以确定二维数组的大小?

时间:2018-03-26 23:31:00

标签: c++ recursion text-files dynamic-arrays flood-fill

我正在进行泛洪填充递归分配,我必须读取一个ASCII艺术文本文件并填写。分配可以在这里找到:https://faculty.utrgv.edu/robert.schweller/CS2380/homework/hw10.pdf

Recursion() //construcor
{
    column = -1;
    row = -1;
    grid = new char*[size of art row];
    for(int i = 0; i < size of art; i++)
    {
        board[row] = new char[size of art column]
    }
}

我不确定是否应该在构造函数中确定数组的大小。我需要知道数组的大小,以便知道用户想要填充艺术文件的位置。此外,这里是更好的上下文的所有代码。 https://pastebin.com/TSYH26Ci

1 个答案:

答案 0 :(得分:1)

我会将您的文件处理为二进制文件。我不知道您正在使用哪种操作系统,API ,所以我会以通用的方式回答......

  1. 获取文件大小siz

    通常从文件末尾搜索0个字节会给你文件大小。

  2. 分配1D数组dat来存储整个文件

    dat = new BYTE[siz];
    
  3. 将文件加载到内存(1D阵列)

    不要忘记使用二进制访问,因为某些ASCII艺术可以使用控制代码( ASCII 低于32),这可能会被文本文件访问损坏。

  4. 扫描行尾

    所以从0开始扫描你的数组,当你找到 ASCII 代码1310时停止。它的位置将为您提供 ASCII艺术

    x分辨率
    int xs;
    for (xs=0;xs<siz;xs++)
     if ((dat[xs]==10)||(dat[xs]==13))
      break;
    

    现在xs应该持有x分辨率。

  5. 计算y分辨率ys

    最安全的方法是计算行尾(13或10)的数量。在这种情况下,您甚至可以将行开始地址存储到某个指针数组BYTE **pixel=new (BYTE*)[ys];,这将使您能够进行简单的2D访问pixel[y][x]。如果 ASCII 艺术品已对齐且每行的大小不变,则可以从尺寸计算ys

    ys = siz/(xs+eol_size)
    

    其中eol_size为1或2,具体取决于所使用的行结尾:((10),(13),(13,10) or (10,13))所以:

    eol_size=1;
    if (xs<siz)
     if ((dat[xs+1]==10)||(dat[xs+1]==13))
      eol_size=2;
    
  6. 由于我们无权访问任何输入文件,我们只能猜测...如果您需要生成一个,请参阅:

    此处 VCL 中的二进制文件访问示例(项目符号#1,#2,#3 ):