试图从函数返回std :: ifstream

时间:2012-04-16 19:34:48

标签: c++

当我尝试使用此功能时,我在两次返回时收到错误。如果我评论它们,我不会得到错误。有什么理由不起作用吗?

 std::ifstream bipgetConfigurationPath() {
    char bipacfFilename[256], bipacfFullPath[512];
    char *bipconfigPath;
    char *bipdefaultConfigFile;
    const char *bipdefaultConfigFileName;
    bipdefaultConfigFile = "./Resources/plugins/Xsaitekpanels/D2B_config.txt";
    bipdefaultConfigFileName = "D2B_config.txt";
    XPLMGetNthAircraftModel(0, bipacfFilename, bipacfFullPath);
    bipconfigPath = strstr(bipacfFullPath, bipacfFilename);
    strncpy(bipconfigPath, bipdefaultConfigFileName, sizeof(bipacfFilename));
    puts(bipacfFullPath);

    // Check if ACF-specific configuration exists
    std::ifstream bipcustomStream(bipacfFullPath);
    if (bipcustomStream.good()) {
        return bipcustomStream;
    } else {
        std::ifstream bipdefaultStream(bipdefaultConfigFile);
        if (bipdefaultStream.good()) {
            return bipdefaultStream;
        }

    }
}

感谢Bill

3 个答案:

答案 0 :(得分:6)

通过创建复制构造函数private,C ++中的所有流类都是不可复制的。这意味着,您无法按值返回流对象。请阅读this了解详情。故事的结尾。

所以解决方法是将流对象传递给函数作为引用,并在函数中打开文件,然后从中返回,或者使用new创建流对象并将指针返回到流对象从函数中,但是如果你这样做,那么当你完成它时,你必须delete该对象。我个人不会做其中任何一个。

我可能会在一个类中封装流和你想对这个对象做的行为/工作。

在C ++ 11中,您可以使用std::move移动流对象,因为流可以移动。

答案 1 :(得分:6)

std :: streams不可复制。

答案 2 :(得分:2)

正如其他人所说,文件流不可复制。也许更像是这样的事情:

bool bipgetConfigurationPath(std::ifstream& ifs) {

    std::string bipdefaultConfigFileName("D2B_config.txt");

    // ...

    ifs.open(bipdefaultConfigFileName);
    return ifs.good();
}