C++中无法在函数间传递fstream文件流对象的问题
C++ fstream对象传参编译错误修复方案
错误根因
C++ 所有文件流类型(fstream/ifstream/ofstream)均禁用了拷贝构造函数,你当前自定义的读写函数使用值传递接收fstream参数,传参时会尝试拷贝流对象,直接触发编译报错。
修复步骤
将所有读写函数的fstream形参改为引用传递,避免拷贝操作,同时补充文件关闭逻辑避免资源泄漏:
- 修正writer函数签名与实现
#include <fstream> #include <string> #include <iostream> using namespace std; // 第一个参数改为fstream& 左值引用类型 void writer(fstream& fileToWrite, string stringToWrite, string fileName) { fileToWrite.open(fileName, ios::app); if(fileToWrite.is_open()) { fileToWrite << stringToWrite << endl; fileToWrite.close(); // 操作完成及时关闭文件 } }
- 对应reader函数做相同修改
// 第一个参数同步改为fstream&引用类型,内部逻辑按你原有读取需求实现即可 void reader(fstream& fileToRead, string targetStr, string fileName) { fileToRead.open(fileName, ios::in); if(fileToRead.is_open()) { // 原有文件读取逻辑 fileToRead.close(); } }
调用说明
修改完成后,你原有actionLogin函数里的调用代码不需要做任何改动,直接传全局定义的usernameFile对象即可正常编译运行:
// 全局流对象定义无需修改 fstream passwordFile; fstream usernameFile; fstream nameFile; void actionLogin() //loginprocedure { string username; string password; cout << "Type in your Username" << endl; cin >> username; system("cls"); cout << "Type in your Password" << endl; cin >> password; system("cls"); cout << "Starting verification" << endl; // 该调用方式无需修改,可直接适配引用传参 reader(usernameFile, username, "UsernameSaveFile"); }
补充说明:C++中所有IO流对象(包括标准输入输出
cin/cout)都不支持拷贝,传递这类对象时必须使用引用或者指针。
内容的提问来源于stack exchange,提问作者Robin Kaiser
相关产品推荐
相关产品推荐

