家庭作业:将文件读入指向指针的char(char **)

时间:2014-10-24 23:12:13

标签: c++ c pointers

我不想把家庭工作放在stackoverflow上。提前抱歉。

我必须编写一个符合以下声明的函数

char ** read_maze(char *filename, int *rows, int *cols )

到目前为止我写的功能是

char ** read_maze(char *filename, int *rows, int *cols )
{
  ifstream maze(filename);
  maze >> *rows >> *cols;
  char * contents[] = new char * [*rows * *cols];
  for (int r = 0; r < *rows; r++) {
    for (int c = 0; c < *cols; c++) {
      if (!maze.eof())
        maze >> contents[r][c];
    }
  }
  return contents;
}

我遇到的问题是访问/写入char-array contents给我一个分段错误。我尝试过各种不同的访问器,但我似乎无法防止发生段错误。

我已经尝试使用谷歌搜索如何在c ++中访问点指针字符,但我找不到任何完全重要的内容。

我尝试过的事情:*内容[r * c],(内容+ r c),*((内容[r])+ c)以及其他许多内容。< / p>

如何将文件读入char **

由于

2 个答案:

答案 0 :(得分:3)

我认为你需要的是:

std::ifstream maze(filename);
std::size_t rowCount, colCount;
maze >> rowCount >> colCount;
std::vector<std::vector<char>> content(rowCount, std::vector<char>(colCount));
for (auto &columns : content) {
    for (auto& c : columns) {
        maze >> c;
    }
}

如果您真的要使用new []

char** read_maze(const char* filename, int& rowCount, int& colCount)
{
    std::ifstream maze(filename);
    maze >> rowCount>> colCount;
    char** contents = new char* [rowCount];
    for (int r = 0; r != rowCount; ++r) {
        contents[r] = new char[colCount];
        for (int c = 0; c != colCount; ++c) {
            if (!maze.eof()) {
                maze >> contents[r][c];
            }
        }
    }
    return contents;
}

但是你必须自己使用delete[]

来销毁你的内容
void delete_maze(char** contents, int rowCount)
{
    for (int r = 0; r != rowCount; ++r) {
        delete [] contents[r];
    }
    delete [] contents;
}

答案 1 :(得分:0)

使用此行,您可以指向字符指针。

  char **contents = new char * [*rows * *cols];

现在你有很多char指针,你必须分配内存。 你可以这样做:

for (int r = 0; r < *rows; r++) {
    for (int c = 0; c < *cols; c++) {
           contents[r][c] = new char[SIZE_OF_STRING];
    }
}

或者您可以使用std::string来避免C-Style char * -pointers。