c ++为什么变量"文件"我申报时未申报?

时间:2014-04-27 17:23:36

标签: c++ variables ofstream undeclared-identifier

我正在使用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();
}

4 个答案:

答案 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,如果它不应该被更改。此外,floatrow的{​​{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