如何将文件与已初始化的 ifstream 对象关联?

Posted

技术标签:

【中文标题】如何将文件与已初始化的 ifstream 对象关联?【英文标题】:How to associate file with already initialised ifstream object? 【发布时间】:2020-04-30 09:30:09 【问题描述】:

我需要一个函数来打开文件并填充我的向量。我在不带参数的向量函数(所以我会写 list = fileBeg())和带向量参数的 void 函数之间考虑(所以我会直接传递我的列表:fileBeg(list))。我选择了第二种方式,因为我还需要我的 ifstream 对象是全局的,这样我才能写下我的输出,这样我的函数就可以像 fileBeg(list, file) 一样工作,但我不知道该怎么做。目前我有:

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 如果 i 已经初始化一样,但它不能这样工作。

我可以用全局变量来做,即使对当前任务没问题,我认为这不是一个好习惯。

【问题讨论】:

【参考方案1】:

流不可分配,因此即使使用正确的语法,您的方法也无法工作。

但是文件流有一个open 方法,所以这个file-&gt;open(fileName); 就是你要找的。​​p>

当然你应该经常检查你是否成功打开文件

file->open(fileName);
if (file->is_open())

    student temp;
    while (*file >> temp)
        list->push_back(temp);

else

     std::cout << "failed to open file!!\n";

【讨论】:

我不应该写(*文件)->打开而不是文件->打开吗? 哦,不,等等,-> 几乎与 *.为什么要使用 ->? @AlexeiSavitsky 它们的工作原理完全相同,但通常首选-&gt;,因为它更易于阅读。

以上是关于如何将文件与已初始化的 ifstream 对象关联?的主要内容,如果未能解决你的问题,请参考以下文章

文件流(fstream/ifstream/ofstream)作为类成员变量的初始化方式

使用 ofstream 将数据写入其文件后更新 ifstream 对象

C++文件读写详解(ofstream,ifstream,fstream)

ifstream 没有匹配的初始化构造函数

如何获取与已登录用户相关的信息?

如何将对象定义为一种类型,然后将其声明为子类型?