Функция C ++ с параметром istream & [duplicate]

0

Я хотел бы, чтобы моя программа читала файл, используя функцию "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: при передаче аргумента 1 из 'bool readFile (std :: istream &)

ошибка 2: неверная инициализация ссылки типа 'std :: istream & {aka std :: basic_istream &}' из выражения типа 'std :: string {aka std :: basic_string}

ошибка 3: неверное пользовательское преобразование из 'std :: istream {aka std :: basic_istream}' в 'const char *' [-fpermissive]

В любом случае, я могу это исправить? Параметр функции действительно должен оставаться "std :: istream & fileName".

Спасибо за помощь.

  • 0
    Имя файла обычно является std::string , а не самим потоком.
  • 0
    Я думаю, что ваш учитель хочет, чтобы вы передавали file в readFile а затем выполняли чтение файла внутри readFile .
Показать ещё 1 комментарий
Теги:
istream

1 ответ

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;
}

Любой из них может работать - вам просто нужно быть последовательным между вызывающим и вызываемым. По сильным предпочтениям вы хотите быть как можно более последовательными на всей базе данных кода.

  • 0
    Это имеет больше смысла, спасибо большое, сэр. Но теперь я получаю эту ошибку: нет соответствующей функции для вызова 'std :: basic_ifstream <char> :: basic_ifstream (std :: string &) в строке "ifstream file (fileName)", и я не совсем понимаю, в чем дело? Говоря о варианте Б.
  • 0
    @ Алекс: Ваш компилятор (или стандартная библиотека, на самом деле) явно устарел. Если вы не можете обновить текущий компилятор, вы можете использовать ifstream file(fileName.c_str());
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню