我目前正在尝试访问来自vector的文件指针.我面临的问题以及我不能单独解决的问题是,我正在重写已经存储的指针,并在最后创建的向量中(或者至少看起来如此).因此,如果我尝试访问它们,只有最后一个可用.也许有一个简单的解决方案,我只是看不到,但我已经花了三天时间试图找到我做错了什么(我已经完全重写了两次代码).
int cnt = 0; vectorabstractFiles; while (cnt < 6) { string path = "D:/tempSort_" + to_string(cnt) + ".txt"; ofstream fileOutput(path); if (!fileOutput) { // todo error exit(1); } AbstractOutput* tmp = new FileOutput(fileOutput, kernel); tmp->WriteLine(to_string(cnt) + " zkouska"); tmp->WriteLine(to_string(cnt) + " zkouska2"); tmp->WriteLine(to_string(cnt) + " zkouska3"); tmp->Close(); delete(tmp); ifstream fileInput(path); if (!fileInput) { exit(1); } abstractFiles.push_back(&(FileInput(fileInput, kernel))); output->WriteLine("CNT = " + to_string(cnt)); for (AbstractInput* it : abstractFiles) { bool succes; output->WriteLine((it)->ReadLine(succes)); } cnt++; }
的FileInput:
using namespace std; class FileInput : public AbstractInput { using AbstractInput::AbstractInput; private: ifstream& inputFile; bool closed; public: FileInput::FileInput(ifstream& inputFile, Kernel* kernel) : AbstractInput(kernel), inputFile{ inputFile }, closed(false) { } int FileInput::Close() { inputFile.close(); closed = true; return 0; } bool FileInput::HasNext() { return !closed; } string FileInput::Read() { return GetKernel()->ReadFromKeyboard(); } string FileInput::ReadLine(bool& success) { string line = GetKernel()->ReadLineFromFile(inputFile, success); closed = !success; return line; } };
内核函数:
string Kernel::ReadLine(istream& stream, bool& success) { string line; if (getline(stream, line)) { success = true; return line; } success = false; return ""; } string Kernel::ReadLineFromFile(ifstream& stream, bool& success) { return ReadLine(stream, success); }
编辑:添加了整个代码+ FileInput类
EDIT2:添加了内核函数
编辑3:我尝试用&(FileInput(inputFile, kernel))
和创建新的指针new FileInput(inputFile, kernel)
.两者都以相同的结果结束 - >只有最后添加的指针有效,其他指向同一文件.
EDIT4:当前输出+预期输出
当前版本的输出:
CNT = 0 0 zkouska CNT = 1 1 zkouska 1 zkouska2 CNT = 2 2 zkouska 2 zkouska2 2 zkouska3 CNT = 3 3 zkouska 3 zkouska2 3 zkouska3 CNT = 4 4 zkouska 4 zkouska2 4 zkouska3 CNT = 5 5 zkouska 5 zkouska2 5 zkouska3 .
预期结果将是:
CNT = 0 0 zkouska CNT = 1 0 zkouska 1 zkouska CNT = 2 0 zkouska 1 zkouska 2 zkouska
还有更多...因为我只读取每个文件的第一行所以zkouska1,zkouska2,...应该永远不会写入输出.
&(FileInput(fileInput))
是包含对变量的引用的临时地址.
你用悬垂的指针填充向量.
您的类包含对循环结束时超出范围的变量的引用.
您希望在堆上创建非临时对象并存储其地址.
auto fileInput = new std::ifstream(path); abstractFiles.push_back(new FileInput(*fileInput));
请记住,之后要正确删除这些指针(ifstream和FileInput).
注意:for循环应该做什么?您abstractFiles
在每次迭代时从每个有效条目中读取一行.
我期待的输出是:
CNT = 0 0 zkouska CNT = 1 0 zkouska2 1 zkouska CNT = 2 0 zkouska3 1 zkouska2 2 zkouska CNT = 3 1 zkouska3 2 zkouska2 3 zkouska CNT = 4 2 zkouska3 3 zkouska2 4 zkouska