使用 istream/ostream 传输消息的类似网络协议

Analogous network protocol for transmitting messages using istream/ostream

提问人:quantumshiv 提问时间:4/27/2016 最后编辑:quantumshiv 更新时间:5/2/2016 访问量:230

问:

这是一个来自编码挑战的问题,我想不出办法——

根据以下原型为简单的有线协议实现 encode() 和 decode():

void encode ( const std::string& inputFilename, std::ostream& out );
void decode ( std::istream& in, const std:string& outputFilename ); 

假设有多个文件,每个文件都包含一条消息。正如原型中已经说过的那样,编码必须从磁盘读取单个指定的文件并将消息放在 ostream 中。

解码必须从 istream 读取单个编码消息,并将其放在指定的文件中。两个相应文件的内容必须相同。

如果我可以在 encode 方法中读取文件并将数据放在缓冲区中并将它们发送到 decode 方法中的另一个文件,这很容易,但这不是问题。如何在没有人实际在控制台上键入数据的情况下读取数据(例如)?std::istreamstd::cin

提前感谢您抽出宝贵时间,并希望看到对此的回应!

C++ STL IOstream ifstream istringstream

评论


答:

1赞 Marek Waszkiewicz 4/27/2016 #1

ISream 是 IFStrate(输入文件流)和 IStlayStream(输入字符串流)的父类,因此可以作为输入参数 ifstream 或 iStringstream 传递。不需要使用 cin。 这同样适用于out参数,你可以提供ofstream或ostringstream的对象。这是 C++ 中众所周知的机制,用于抽象您处理的特定类型的流。

评论

0赞 quantumshiv 4/27/2016
谢谢你为我指明了正确的方向。当我开始对 I/OStringstream 进行更多探索时,我了解到我必须使用 ostringstream::rdbuf 将流中的数据从编码复制到解码。这是正确的方法吗?
0赞 quantumshiv 5/2/2016 #2

我写了一段代码,可以与问题中给出的原型一起使用。我相信可以有更多方法可以做到这一点,但我想我会分享这一点。

class fileIO
{
private:
    std::string inBuf;
public:
    std::stringstream testbuf; 
    void encode(const std::string& inputFilename, std::ostream& out);
    void decode ( std::istream& in, const std::string& outputFilename);
};

void fileIO::encode(const std::string& inputFilename, std::ostream& out)
{
    //read from the input file and stream it to ostream
    ifstream infile(inputFilename);
    while(infile.good()){
        getline(infile, inBuf);
        out << inBuf;
    }
    cout << "Value stored in outBuf: " << inBuf << endl;
    infile.close();
}

void fileIO::decode(std::istream& in, const std::string& outputFilename)
{
    //read from istream and output it to a file
    string val;
    ofstream ofile(outputFilename);
    in >> val;
    cout<< "Read the istream contents: " << val << endl;
    ofile << val;

    ofile.close();
}
int main( int argc, char ** argv )
{
    fileIO File; 
    string inputFile;
    cout << "Enter input File Name: "<< endl;
    cin >> inputFile;

    File.encode(inputFile, File.testbuf);
    File.decode(File.testbuf, inputFile);
    return 0;
}

我正在传递“字符串流”进行编码和解码,因为 istream 和 ostream 是 stringstream 的父类。在此解决方案中,输入文件中的值存储在字符串流中,并传递到解码中,其中来自同一字符串流的值将写入输出文件。