Аналогичный сетевой протокол для передачи сообщений с использованием istream/ostream

Это был вопрос, связанный с проблемой кодирования, и я не мог придумать, как это сделать -

Реализуйте encode() и decode() для простого проводного протокола для прототипов ниже:

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

Допустим, есть несколько файлов, каждый из которых содержит одно сообщение. Как уже сказано в прототипе, кодировка должна прочитать один указанный файл с диска и поместить сообщение в ostream.

Декодер должен прочитать одно закодированное сообщение из istream и поместить его в указанный файл. Содержимое двух соответствующих файлов должно быть идентичным.

Это легко, если бы я мог прочитать файл в методе кодирования и поместить данные в буфер и отправить их в другой файл в методе декодирования, но это не вопрос. Как я могу прочитать данные из std::istream без того, чтобы кто-то на самом деле печатал данные на консоли (например, std::cin)?

Заранее спасибо за ваше время и будем рады видеть ответы на это!

2 ответа

istream является родительским классом для ifstream (поток входных файлов) и istringstream (поток входных строк), поэтому вы можете передать в качестве входного параметра ifstream или istringstream. Не нужно использовать CIN. То же относится и к параметру out, вы можете предоставить объект ofstream или ostringstream. Это хорошо известный механизм в C++, позволяющий абстрагироваться от конкретного типа потока, с которым вы имеете дело.

Я написал фрагмент кода, который работает с прототипами, приведенными в вопросе. Я уверен, что могло бы быть больше способов сделать это, но я думал, что поделюсь этим.

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. В этом решении значение из входного файла сохраняется в потоке строки и передается для декодирования, где значение из того же потока строки записывается в выходной файл.

Другие вопросы по тегам