如果没有提供文件名,我想使用默认值。或者,如果提供了文件名但无法访问该文件,请使用默认值。
int main(int argc, char * argv[]) {
// default settings
bool flag = false;
string fileName = "defaultMap.txt";
ifstream *infile = new ifstream(fileName);
if (argc > 1) {
fileName = argv[i]; // otherwise, it is a file name
flag = true;
delete infile;
ifstream *infile = new ifstream(fileName);
//if file is not valid:
if (!infile->good() || infile->fail()) {
cout << "Problem loading board from map file \'" << fileName << "\'." << endl;
delete infile;
flag = false;
}
}
if (!flag) ifstream *infile = new ifstream("defaultMap.txt"); //change back to default
Board * grid = new Board(*infile, playerRace, flag);
// MORE STUFF FOR MAIN HERE
}
然后,我将文件发送到一个函数,该函数逐字符地读取它以填充矩阵。 Board()只被调用一次,而每次玩家进入新房间时都会调用boardInit,并且需要从文件中读取更多信息。
Board::Board(ifstream & fileName, string race, bool flag) {
player = new Player(race);
boardInit(fileName, race, flag);
}
void Board::boardInit(ifstream & fileName, string race, bool flag) {
char cell;
game = new Cell*[maxRow];
for (int row = 0; row < maxRow; row++) {
game[row] = new Cell[maxCol];
for (int col = 0; col < maxCol; col++) {
fileName.get(cell);
}
}
// MORE STUFF FOR boardINIT here
}
当我尝试编译时,我收到错误
main.cc:122:23: error: unused variable 'infile' [-Werror,-Wunused-variable]
if (!flag) ifstream *infile = new ifstream("defaultMap.txt"); //change back to default
^
1 error generated.
即使我将其传递到下方(Board * grid = new Board(*infile, playerRace, flag);
)
答案 0 :(得分:2)
您正在使用相同名称隐藏上一个变量。
int main(int argc, char * argv[]) {
// default settings
bool flag = false;
string fileName = "defaultMap.txt";
ifstream *infile = new ifstream(fileName); // <-------------- HERE
请参阅?您首先在上面定义了它,然后,您不会在if语句中使用它,因为您创建了一个名为隐藏 infile
在主要顶部的新变量。因此,if语句中的infile
使其生命周期在if (!flag)
范围的末尾过期,因此它将不再存在,并且您的infile
变量将从顶部再次显示:
if (!flag) ifstream *infile = new ifstream("defaultMap.txt"); //change back to default
要使用您之前的变量,请不要使用新变量的声明隐藏它,只需使用上一个:
if (!flag) infile = new ifstream("defaultMap.txt"); //change back to default
此外:
考虑将"defaultMap.txt"
更改为字符串常量:
static const string defaultFileName = "defaultMap.txt";
string fileName = defaultFileName;
// ... and later:
if (!flag) infile = new ifstream(defaultFileName); //change back to default
考虑使用智能指针,因为它已经是2016年了。请查看shared_ptr或unique_ptr。
考虑只是为了审核您自己的代码,您需要在此处进行大量重构,这将极大地简化您的代码并使人们更容易阅读和理解。
答案 1 :(得分:1)
让我们看看这段特殊的代码
if (!flag) {
ifstream *infile = new ifstream("defaultMap.txt");
}
此处定义的 infile
只有花括号的范围。如果你试图在花括号之外使用它,它就不会被看见。在您的情况下,当您在本节后使用infile
时,您实际上使用在顶部声明的同名变量。如此有效,此块中定义的infile
未被使用,因此警告。
答案 2 :(得分:0)
您收到警告,因为如果if
条件评估为false
,则不会声明该变量,因此未使用。您已经声明了它,因此请省略ifstream
并将其更改为infile = new ifstream(filename);