带有istream& C ++的C ++函数参数

时间:2014-02-02 00:01:01

标签: c++ istream

我希望我的程序使用下面的函数“readFile”读取文件。我试图找出如何使用istream&调用函数。参数。该函数的目标是通过接收文件名作为参数来读取文件。

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
using namespace std;

bool readFile(std::istream& fileName); //error 1 this line

int main(void)
{   
    string fileName;

    cout << "Enter the file name: ";
    cin >> fileName;

    readFile(fileName); //error 2 this line


}

bool readFile(std::istream& fileName)
{
    ifstream file(fileName, ios::in); //error 3 this line
    return true;
}

我得到的三个错误:

错误1:传递'bool readFile(std :: istream&amp;)

的参数1

错误2:'std :: istream&amp;类型的引用的初始化无效来自'std :: string {aka std :: basic_string}

类型的表达式的{aka std :: basic_istream&amp;}'

错误3:从'std :: istream {aka std :: basic_istream}'到'const char *'的无效用户定义转换[-fpermissive]

无论如何我可以解决它吗?该函数的参数实际上必须保持“std :: istream&amp; fileName”。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您需要决定是要传递字符串还是文件名。如果传递一个字符串,那么调用者需要传递该字符串,并且需要编写该函数以期望文件名。

如果您决定传递一个流,则调用者需要打开并传递该流,并且需要编写该函数,期望它只使用它。

选项A:

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
using namespace std;

bool readFile(std::string const &fileName);

int main(void)
{   
    string fileName;

    cout << "Enter the file name: ";
    cin >> fileName;

    readFile(fileName);
}

bool readFile(std::string const &fileName)
{
    ifstream file(fileName);
    return true;
}

选项B:

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
using namespace std;

bool readFile(std::istream& file);

int main(void)
{   
    string fileName;

    cout << "Enter the file name: ";
    cin >> fileName;

    ifstream file(fileName);
    readFile(file);
}

bool readFile(std::istream& fileName)
{
    return true;
}

任何一个都可以工作 - 你只需要在调用者和被调用者之间保持一致。通过强烈的偏好,您希望在给定的代码库中尽可能保持一致。