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,您只阅读内容。