Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 家庭作业:将文件读入指向指针char(char**)的指针_C++_C_Pointers - Fatal编程技术网

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

C++ 家庭作业:将文件读入指向指针char(char**)的指针,c++,c,pointers,C++,C,Pointers,我讨厌把家庭作业放在工作上。先说声对不起 我必须编写一个符合以下声明的函数 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

我讨厌把家庭作业放在工作上。先说声对不起

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

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**read\u迷宫(char*filename,int*rows,int*cols)
{
ifstream迷宫(文件名);
迷宫>>*行>>*列;
字符*内容[]=新字符*[*行**列];
对于(int r=0;r<*行;r++){
对于(int c=0;c<*cols;c++){
如果(!maze.eof())
迷宫>>内容[r][c];
}
}
返回内容;
}
我遇到的问题是,访问/写入char数组
contents
会导致分段错误。我尝试过各种不同的访问器,但似乎无法阻止segfault的发生

我尝试过如何在C++中访问点指针字符,但我找不到任何实质性的东西。 我尝试过的东西:*contents[r*c]、(contents+rc)、*((contents[r])+c)以及其他许多东西

如何将文件读入
字符**


谢谢

有了这一行,您就有了一个指向字符指针的指针

char**contents=new char*[*行**cols];
现在有很多字符指针需要分配内存。 您可以这样做:

for(int r=0;r<*行;r++){
对于(int c=0;c<*cols;c++){
contents[r][c]=新字符[字符串的大小];
}
}

或者您可以使用
std::string
来避免C风格的字符*指针。

我认为您需要的是:

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;
    }
}
但是你必须自己用
delete[]
销毁你的内容:

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;
}
void delete_maze(char** contents, int rowCount)
{
    for (int r = 0; r != rowCount; ++r) {
        delete [] contents[r];
    }
    delete [] contents;
}

您还必须初始化
内容[r]
,或使用
std::vector
。行和列变量是什么?我可能错了,但看起来内容正在初始化为
**char[]
。在分配字符[x]之前,您需要先分配字符[x]。不幸的是,如上所述,这是家庭作业,所以我不能经常使用矢量字符!你让我开心!作为记录,我必须稍微修改一下您的方法声明(以获取指针),并且不要使用
const
filename(不确定为什么,这应该可以吗?),除此之外,它工作得很好!由于您不修改
文件名
内容,因此它应该是
常量字符*
(但您必须匹配错误的原型:-/)。否则,您可能不使用(const)文字字符串来调用<代码> Read MaseZ/<代码>(如<代码> Read MaseZeMe(MyOpPosith.txt)和RoeCube,和COLCUTION/<代码>),但必须使用一些包含路径的缓冲区……这是一个大学C++教授。我的生活完全由匹配的坏原型组成:/Yes,你必须在for循环之前执行this循环。但是如果你想写一些东西,你必须要考虑的是你必须用流来写。使用ifstream,您只阅读内容。