【发布时间】:2016-03-05 10:36:51
【问题描述】:
我目前正在尝试从 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、……不应该被写入输出。
【问题讨论】:
-
您正在获取一个临时地址,该地址将立即超出范围,因此您的向量有一个悬空指针。
-
附加问题:似乎在(while 循环的)每个循环中,您总是打开同一个文件,因为变量
path没有改变。 -
你能编辑你的问题并附加
FileInput的定义吗? -
对不起,我没有发布整个代码,我会编辑它。
-
您仍然缺少一些代码。什么是
kernel?