如何在fstream文件之间切换而不关闭它们(同步输出文件)-C ++

文斯

我有一个C ++的小问题,无法通过在线浏览解决。这是我的代码(摘录):

if(File.is_open()) {
    while(!File.eof())  {
        i++;
        getline(File,Line);
        if(i>=2) {                //Skip Headers
            int CharCount=0;
            for(int CharPosition=0; CharPosition<Line.size(); CharPosition++)                       {
                if(Line[CharPosition]==',') {
                    Length=CharPosition;
                    break;
                }
            }
            NameText=Line.substr(0,Length);
            Path= Path_Folder + "\\" + NameText + ".csv";
            if(!CheckExistance(Path.c_str())) {
                fstream Text_File;
            }
            Text_File.open(Path, fstream::in | fstream::out | fstream::app);
            Text_File<<Line<<"\n";
            Text_File.close();
        }
    }
}

这段代码运行良好,但是我想改变一个事实,即它Text_File每次在while循环中进入时都会关闭

基本上,该程序将一个较大的输入文件拆分为许多较小的文件。随着我的小文件越来越大,执行速度越来越慢(正常)。然后,我的目标是让所有较小的文件(Text_File)在此while循环中打开,并将fstream指针(指针?)从一个切换到另一个。

我试图更改为:

...

NameText=Line.substr(0,Length);
Path= Path_Folder + "\\" + NameText + ".csv";

if(!CheckExistance(Path.c_str())) {
    fstream Text_File;
}

if(!Text_File.open()) {
    Text_File.open(Path, fstream::in |fstream::out | fstream::app);
}

Text_File<<Line<<"\n";
\\Text_File.close();

...

但是Text_File不管是什么,它都在相同的条件下工作NameText因此,我猜测fstream的指针Text_File不会改变。那我需要是什么?休息指针?如何?

谢谢你们!

不确定是否相关,但是我正在使用Microsoft Visual C ++ 2010 Express。此外,无论是受过教育还是生活,我都不是程序员,因此,如果您不用太高的词汇就能解释它,我将不胜感激。

看来您想filebufostream对象处理s

现在,唯一的障碍是该类型ostreambasic_filebuf<char>类型不是可复制的类型,因此您不能将它们直接放入映射中(按文件名)。通过创建一个小Holder类型可以很容易地解决这个问题

struct Holder {
    Holder(std::string const& path) 
        : buf(std::make_shared<std::filebuf>())
    { 
        buf->open(path.c_str(), std::ios::out | std::ios::app);
    }
    std::shared_ptr<std::filebuf> buf;
};

std::map<std::string, Holder> buffers;

现在,完整的程序(经过测试)将如下所示:

#include <fstream>
#include <sstream>
#include <iostream>
#include <map>
#include <memory>

const std::string Path_Folder = ".";

int main()
{
    std::istream& File     = std::cin; // just for example
    std::filebuf  dummy;
    std::ostream  TextFile(&dummy);

    struct Holder {
        Holder(std::string const& path) 
            : buf(std::make_shared<std::filebuf>())
        { 
            buf->open(path.c_str(), std::ios::out | std::ios::app);
        }
        std::shared_ptr<std::filebuf> buf;
    };

    std::map<std::string, Holder> buffers;
    int i = 0;

    std::string   Line;
    while(getline(File, Line))
    {
        if (i++<2)
            continue; //Skip Headers

        auto NameText = Line.substr(0, Line.find(','));
        auto Path = Path_Folder + '/' + NameText + ".csv";

        // open, only if not allready opened
        auto found = buffers.find(NameText);
        if (end(buffers) == found)
            found = buffers.insert({ NameText, Path }).first;

        TextFile.rdbuf(found->second.buf.get());

        TextFile << Line << std::endl; // notice implicit std::flush in std::endl
    }

    // all files are automatically closed here
}

另外三个注意事项:

  • buffers地图超出范围时,文件会自动关闭
  • rdbuf()如果您不以隐式结尾std::flush(如std::endl结束行,则可能需要在进行此类切换时添加显式刷新
  • dummy仅存在有一个ostream我们可以切换缓冲区的对象

我使用以下输入进行了测试:

Header Row #1
Header Row #2
Jack,1,some data
Jill,2,some more data
Jack,3,not reopening :)
Jill,4,jill still receiving output
Romeo,5,someone else reporting

现在,我得到了以下的输出:看到它住在Coliru

/tmp$ rm *.csv
/tmp$ make && ./test < input.txt && tail *.csv

g++ -std=c++11 -Wall -g test.cpp -o test
==> Jack.csv <==
Jack,1,some data
Jack,3,not reopening :)

==> Jill.csv <==
Jill,2,some more data
Jill,4,jill still receiving output

==> Romeo.csv <==
Romeo,5,someone else reporting

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不关闭的情况下保存和读取c ++ fstream文件

如何在.NET / C#中的异步和同步之间切换

C ++如何在类成员之间实现切换

如何切换CSV文件的列(C#)

如何在C ++中的函数中输出文件?

Netbeans:如何在c和c ++编译器之间切换?

使用c在文本文件中的项目之间切换

如何在C#XNA程序中的动画之间切换?

如何在一个文件中引用类/方法而不关心它们的顺序(C++)

python ghostscript不关闭输出文件

如何在C中切换字符串?

如何在 unity c# 中切换?

如何在两个页面之间切换而不丢失其数据:WPF,C#

如何在C ++ 11 RNG的初始状态的本地设置和全局设置之间切换?

如何在不按下按钮的情况下通过 c# 代码在内容控件之间切换?

如何在C ++中同时使用`fstream`在文件中读写?

如何在C ++中减小fstream文件的大小

如何在C ++中同时使用`fstream`读写文件?

如何在 C++ 中使用 fstream 读取 .txt 文件

打印奇怪的符号以输出文件,C ++

在输出文件C ++中搜索整数

如何在C中正确关闭文件

如何回到在C ++中切换

目标C:切换视图后关闭音乐

如何在不使用C / C ++循环的情况下切换n次?

如何在Azure门户中以编程方式使用C#获取或更新或切换或操纵自动关闭参数来选择选定的Azure VM?

如何创建循环以在 C 中的功能菜单之间切换?

C ++使用<输入文件和>输出文件启动程序

在G ++版本之间切换以支持C ++ 11