在c ++中初始化std :: ofstream的向量

时间:2015-01-27 09:15:13

标签: c++ vector cygwin ofstream

如何初始化std :: ofstream的向量? 我正在进行套接字编程,我接收不同符号的数据。对于每个符号,我需要分配一个单独的文件句柄来向其写入数据。所以,我需要一个std :: ofstream数组。现在我想初始化其中的100个std :: ofstream。但它对我不起作用。请查看以下代码并提出替代方案。

int main(){
std::vector <std::ofstream > myFilePointerMap;
std::ofstream  ofs;
    ofs.open("E:\\data\\test.txt", std::ios::app);
    for(int i=0;i<100;i++){
        myFilePointerMap.push_back( ofs);
    }
}

我正在使用Windows eclipse中的cygwin gcc进行编译。

编译时出现以下错误:

&#39;的std ::的ios_base&安培; std :: ios_base :: operator =(const std :: ios_base&amp;)&#39;是私有线789,外部位置:D:\ cygwin64 \ lib \ gcc \ x86_64-pc-cygwin \ 4.8.3 \ include \ c ++ \ bits \ ios_base.h C / C ++问题

请帮助我。

修改 让我解释一下我需要做什么,以便也可以支持替代解决方案。 我需要创建一个侦听套接字的对象。现在,此套接字接收最多100条不同的消息,这些消息需要写入单独的文件,具体取决于各个消息中收到的id(1-100)。

目前,我已经创建了一个包含文件路径的字符串向量。标题中的声明如下:

std::vector <std::string> filePathMap;

然后我在构造函数中初始化这些文件路径,如下所示:

for(int i=0;i<100;i++){
    filePathMap.push_back(" ");
}

然后对于1到100之间的随机索引,当我订阅消息时,我将相关文件路径设置为

filePathMap[j]=filePath;

每当收到消息后,我都会打开与filePathMap和index对应的文件,写入并关闭它。

最初,我想创建一个与这些不同符号对应的文件指针向量,这样当我收到一条消息时,我可以简单地写入文件指针,而不会每次都打开和关闭。因此,我在我的头文件中定义了ofstreams的向量,如下所示:

    std::vector <std::ofstream > myFilePointerMap;

但是在构造函数中,当我输入以下代码时,我得到错误:

std::ofstream  ofs;
ofs.open("E:\\data\\test.txt", std::ios::app);
for(int i=0;i<100;i++){
    myFilePointerMap.push_back( ofs); //THIS DOES NOT COMPILE
}    

请注意,我只是尝试将myFilePointerMap的vector初始化为100,这样当我稍后在代码中分配myFilePointerMap时,它应该可以正常工作。

 myFilePointerMap[j].open(filePath.c_str(),std::ios::app);

这里,j可以是0-99之间的任何东西。

1 个答案:

答案 0 :(得分:7)

std::ofstream不可复制,但从C ++ 11开始可移动。如果您的编译器不支持移动,请将std::move() ofs放入vector或使用vector<>(智能)指针。