【问题标题】:How can I read from a .txt file to determine the size of a 2-D array?如何从 .t​​xt 文件中读取以确定二维数组的大小?
【发布时间】:2018-03-26 23:31:00
【问题描述】:

我正在做一个洪水填充递归作业,我必须读取一个 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

【问题讨论】:

  • 我建议您首先阅读与阅读文件相关的文档:en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream(底部有一个示例)。当您遇到特定问题时编辑此问题。
  • 艺术作品的大小是行数乘以一行中的最大字符数。在阅读文件之前,您可以知道这些数字。我建议将文件读入vectorstringvectorsize 是行数。 strings 的最大 length 是列数。然后,您可以将 strings 转换为 char 的数组,如果您希望这样做的话。

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


【解决方案1】:

我会将您的文件作为二进制文件处理。我不知道您使用的是哪个OS,API,所以我会以一般的方式回答...

  1. 获取文件大小siz

    通常从文件末尾寻找0字节会给你文件大小。

  2. 分配一维数组dat 来存储您的整个文件

    dat = new BYTE[siz];
    
  3. 将文件加载到内存中(一维数组)

    不要忘记使用二进制访问,因为某些 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. 计算分辨率ys

    最安全的方法是计算行尾数(13 或 10)。在这种情况下,您甚至可以将行起始地址存储到某个指针数组BYTE **pixel=new (BYTE*)[ys];,这将使您能够进行简单的二维访问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;
    

由于我们无法访问任何输入文件,我们只能猜测...如果您需要生成一个,请参阅:

这里是VCL中二进制文件访问的例子(项目符号#1,#2,#3):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多