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

时间:2016-04-26 20:00:04

标签: c++ stl iostream ifstream istringstream

这是一个来自编码挑战的问题,我无法弄清楚如何做到这一点 -

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

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

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

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

如果我可以在encode方法中读取文件并将数据放入缓冲区并将其发送到解码方法中的另一个文件,这很容易,但这不是问题。如果没有实际在控制台上输入数据的人(如std::istream),我如何从std::cin读取数据?

提前感谢您的时间,并希望看到对此的回复!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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;
}

我正在将“stringstream”传递给编码和解码,因为istream和ostream是stringstream的父类。在此解决方案中,输入文件中的值存储在stringstream中,并传递给解码器,将来自相同stringstream的值写入输出文件。