How to construct a c++ fstream from a POSIX file descriptor?

后端 未结 7 2134
情歌与酒
情歌与酒 2020-11-22 12:36

I\'m basically looking for a C++ version of fdopen(). I did a bit of research on this and it is one of those things that seems like it should be easy, but turns out to be v

7条回答
  •  南方客
    南方客 (楼主)
    2020-11-22 12:47

    Part of the original (unstated) motivation of this question is to have the ability to pass data either between programs or between two parts of a test program using a safely created temporary file, but tmpnam() throws a warning in gcc, so I wanted to use mkstemp() instead. Here is a test program that I wrote based on the answer given by Éric Malenfant but using mkstemp() instead of fdopen(); this works on my Ubuntu system with Boost libraries installed:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    using boost::iostreams::stream;
    using boost::iostreams::file_descriptor_sink;
    using boost::filesystem::path;
    using boost::filesystem::exists;
    using boost::filesystem::status;
    using boost::filesystem::remove;
    
    int main(int argc, const char *argv[]) {
      char tmpTemplate[13];
      strncpy(tmpTemplate, "/tmp/XXXXXX", 13);
      stream tmp(mkstemp(tmpTemplate));
      assert(tmp.is_open());
      tmp << "Hello mkstemp!" << std::endl;
      tmp.close();
      path tmpPath(tmpTemplate);
      if (exists(status(tmpPath))) {
        std::cout << "Output is in " << tmpPath.file_string() << std::endl;
        std::string cmd("cat ");
        cmd += tmpPath.file_string();
        system(cmd.c_str());
        std::cout << "Removing " << tmpPath.file_string() << std::endl;
        remove(tmpPath);
      }
    }
    

提交回复
热议问题