Как связать файл с уже инициализированным объектом ifstream? - PullRequest
0 голосов
/ 30 апреля 2020

Мне нужна функция, чтобы открыть файл и заполнить мой вектор. Я думал между векторной функцией без аргументов (поэтому я бы написал list = fileBeg ()) и void функцией с векторным аргументом (так что я бы просто передал свой список: fileBeg (list)). Я выбрал 2-й способ, потому что мне также нужно, чтобы мой объект ifstream был глобальным, чтобы я мог записать свой вывод, чтобы моя функция работала как fileBeg (список, файл), но я не уверен, как это сделать. В настоящее время у меня есть:

void fileBeg(std::vector <student> * list, std::ifstream * file) {
    std::string fileName;
    std::cout << "Input name of file: ";
    std::cin >> fileName;
    std::ifstream (* file)(fileName);
    student temp;
    while(* file >> temp){
        (* list).push_back(temp);
    }
}

Но я, очевидно, получаю ошибку на std::ifstream (* file)(fileName);, потому что это переопределение объектного файла ifstream. Мне нужно что-то вроде (* file) (fileName), так же, как мы пишем i = 5, если я уже инициализирован, но это не работает таким образом.

Я мог бы сделать это с глобальной переменной, и даже если это нормально для текущей задачи, я не думаю, что это хорошая привычка.

1 Ответ

1 голос
/ 30 апреля 2020

Потоки нельзя назначить, поэтому ваш метод не может работать даже с правильным синтаксисом.

Но у файловых потоков есть метод open, поэтому этот file->open(fileName); - то, что вы ищете.

И, конечно, вы всегда должны проверять, успешно ли вы открыли файл

file->open(fileName);
if (file->is_open())
{
    student temp;
    while (*file >> temp){
        list->push_back(temp);
}
else
{
     std::cout << "failed to open file!!\n";
}
...