Я хотел бы, чтобы моя программа читала файл, используя функцию "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".
Спасибо за помощь.
Вам нужно решить, будете ли вы передавать строку или имя файла. Если вы передаете строку, то вызывающему нужно передать строку, и функция должна быть записана для ожидания имени файла.
Если вы решили передать поток, вызывающему нужно открыть и передать поток, и функция должна быть написана в ожидании потока, который он будет использовать.
вариант 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;
}
Любой из них может работать - вам просто нужно быть последовательным между вызывающим и вызываемым. По сильным предпочтениям вы хотите быть как можно более последовательными на всей базе данных кода.
ifstream file(fileName.c_str());
std::string
, а не самим потоком.file
вreadFile
а затем выполняли чтение файла внутриreadFile
.