我正在使用visual studio 2012编写正常的c ++,并且我继续为我声明的变量收到此错误。
1>c:\users\joe\skydrive\documents\c++\consoleapplication2\matracies 1.cpp(182): error C2065: 'file' : undeclared identifier
1>c:\users\joe\skydrive\documents\c++\consoleapplication2\matracies 1.cpp(184): error C2065: 'file' : undeclared identifier
这是我收到错误的函数。
void WriteMatrix(vector<vector<float>> Matrix, float row, float col, int choice)
{
if (choice == 1)
{
ofstream file("MultiplyMatrix.txt", ios::app);
}
else if (choice == 2)
{
ofstream file("AddMatrix.txt", ios::app);
}
else if (choice == 3)
{
ofstream file("AddMatrix.txt", ios::app);
}
for(int i=0; i<row; i++)
{
for(int j=0; j<col; j++)
{
float temp = Matrix[i][j];
file<<temp<<" ";
}
file<<endl;
}
file<<endl;
file.close();
}
答案 0 :(得分:3)
正如奥利所说,file
仅存在于其定义的区块内。
您需要在if语句之前定义file
。然后使用file.open
打开所选文件。
并考虑如果选择既不是1,2或3会发生什么。
答案 1 :(得分:2)
在C ++中,{ }
用于表示范围。这意味着file
仅在if
语句中声明。您可以通过在if语句之外声明file
并在其中打开它来解决此问题:
ofstream file; int choice;
if (choice == 1)
{
file.open("MultiplyMatrix.txt", ios::app);
}
else if (choice == 2)
{
file.open("AddMatrix.txt", ios::app);
}
else if (choice == 3)
{
file.open("AddMatrix.txt", ios::app);
}
return 0;
}
答案 2 :(得分:2)
您正在尝试访问其生命周期结束的条件分支之外的文件变量。当你在{...}条件块中声明它们时,它将在结束时超出范围。
正确的解决方案是在条件分支范围之外的函数开头声明它,然后在分支中打开所需的文件,或者仅在条件块之后打开。
我也会考虑在这种情况下使用switch语句,而不是连续if / elseif / ...因为这是switch语句的用法!
因此,您的代码将是这样的(也有适当的缩进):
void WriteMatrix(vector<vector<float>> Matrix, float row, float col, int choice)
{
这是第一个被证明的替代品,可能是最好的C ++解决方案:
static const vector<string> filenameLookUpTable{"MultiplyMatrix.txt",
"AddMatrix.txt", "AddMatrix.txt"};
ofstream file(filenameLookUpTable.at(choice-1), ios::app);
你也可以这样做:
ofstream file;
switch(choice) {
case 1:
file.open("MultiplyMatrix.txt", ios::app);
break;
case 2:
file.open("AddMatrix.txt", ios::app);
break;
case 3:
file.open("AddMatrix.txt", ios::app);
break;
}
你也可以这样写:
string filename;
switch(choice) {
case 1:
filename = "MultiplyMatrix.txt";
break;
case 2:
filename = "AddMatrix.txt";
break;
case 3:
filename = "AddMatrix.txt";
break;
}
ofstream file(filename, ios::app);
然后结束,基本上:
for(int i=0; i<row; i++)
{
for(int j=0; j<col; j++)
{
float temp = Matrix[i][j];
file<<temp<<" ";
}
file<<endl;
}
file<<endl;
file.close();
}
答案 3 :(得分:1)
void WriteMatrix(vector<vector<float>> Matrix, float row, float col, int choice)
这会通过值{/ em>传递Matrix
,这意味着复制,这对于大型矩阵来说可能非常耗时。而是通过引用将其传递给const
,如果它不应该被更改。此外,float
和row
的{{1}}参数类型也是不合理的;制作col
。
int
然后是这段代码,
void WriteMatrix(vector<vector<float>> const& Matrix, int row, int col, int choice)
做两件事:
选择文件名
它使打开和关闭文件的代码重复三次。
在每个分支中,if (choice == 1)
{
ofstream file("MultiplyMatrix.txt", ios::app);
}
else if (choice == 2)
{
ofstream file("AddMatrix.txt", ios::app);
}
else if (choice == 3)
{
ofstream file("AddMatrix.txt", ios::app);
}
变量是本地自动变量,它在花括号块的末尾不再存在(因此,文件关闭)。
三重冗余是不合适的,并且无法访问其后期打算使用的变量。因此,在选择文件名后将该逻辑移至。然后,选择本身可以简化为简单的数组索引:
file