由sstream初始化的C ++(pre C ++ 11)fstream

时间:2014-03-02 18:40:23

标签: c++ stringstream

我正在尝试打开其他进程stdin并使用C ++写入它,没有dup()和其他C技巧。但遗憾的是,采用字符串的fstream构造函数似乎只能从C ++ 11中获取(来源:http://www.cplusplus.com/reference/fstream/fstream/fstream/

#include <iostream>
#include <fstream>
#include <sstream>

//using namespace std;

int main()
{
    pid_t pid = fork();
    if (pid == 0)
    {
        // std::cout << "child:" << i << std::endl;
        std::string line;
        std::cin.sync();
        std::cout << "child got message:" << std::endl;
        while ( std::getline(std::cin, line) )
        {
        std::cout << line << std::endl;

        }
        std::cout << "child done receiving" << std::endl;


    }
    else{
        //std::cout << "parent"<<std::endl;
        std::ifstream file("stdin", std::ios::in);
        if(file.is_open())
        {
        std::string tmp, str;

        std::stringstream pidstr;
        pidstr << "/proc/" << pid << "/fd/0";

        while ( std::getline(file, tmp) )
            str += tmp + "\n";

        std::fstream other( (pidstr.str().c_str()), std::ios::out);
        other << str ;
        }
    }

    return 0;
}

我有四个问题:

  1. 是“pidstr.str()。c_str()”大多数C ++方式吗?看起来很难看。
  2. 这是正确的C ++方式还是有更好的选择?
  3. 据我所知,getline()是阻塞的,我可以省略cin.sync(),期待孩子等待输入吗?
  4. 为什么我需要按两次输入,(不管我是否在孩子注释掉了getchar(!))
  5. 感谢您的理解。

    编辑:使用Code:Blocks,Linux 13.04

    编译并生成所需的输出

    EDIT2:不,显然这不会产生所需的输出。我添加了一些更改:父级等待孩子退出(这里不重要)。

    但也改变了这个(在孩子身上):

        while ( std::getline(std::cin, line) )
        {
        std::cout << line << std::endl;
        }
        std::cout << "child done" << std::endl;
    

    到此:

        std::getline(std::cin, line);
        int lines; // this is single line sent as first from parent, containing int
        std::istringstream toint(line);
        toint >> lines;
        std::cout << "how much lines should it read:" << lines << std::endl;
    

    似乎孩子会在stdin上等待任何事情,然后打印出父母发送的内容。真的,有时我想知道我应该如何将C ++视为优于普通C:/

0 个答案:

没有答案