gpt4 book ai didi

指向文件的指针的 C++ vector

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:55 25 4
gpt4 key购买 nike

我目前正在尝试从 vector 访问指向文件的指针。我面临的问题是我无法单独解决的问题是我正在用最后创建的(或者至少看起来是这样)重写 vector 中已经存储的指针。因此,如果我尝试访问它们,则只有最后一个可用。也许有一个我看不到的简单解决方案,但我已经花了三天时间试图找出我做错了什么(我已经从头开始完全重写了两次代码)。

int cnt = 0;
vector<AbstractInput*> abstractFiles;
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++;

}

文件输入:

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:添加内核函数

EDIT3:我尝试使用 &(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)) 是保存对变量的引用的临时地址。

  1. 用悬挂指针填充 vector 。
  2. 您的类包含对在循环结束时超出范围的变量的引用。

您想在堆上创建非临时对象并存储它们的地址。

auto fileInput = new std::ifstream(path);
abstractFiles.push_back(new FileInput(*fileInput));

记得在之后正确地删除那些指针(ifstream 和 FileInput)。

注意:for 循环应该做什么?在每次 while 迭代中,您从 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

关于指向文件的指针的 C++ vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34021530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com