当前位置:  开发笔记 > 编程语言 > 正文

C++指向文件的向量

如何解决《C++指向文件的向量》经验,为你挑选了1个好方法。

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

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

} 

的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,...应该永远不会写入输出.



1> Pixelchemist..:

&(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

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有