2016-04-26 8 views
0

Это был вопрос от проблемы кодирования и я не мог понять, каким образом сделать это -Аналогичную сетевой протокол для передачи сообщений с использованием IStream/ostream

Реализовать закодировать() и декодирование() для простой проволоки протокол на прототипы ниже:

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

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

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

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

Заранее благодарим за ваше время и хотели бы видеть ответы на это!

ответ

1

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

+0

Спасибо, что указал мне в правильном направлении. Когда я начал изучать больше в I/OStringstream, я узнал, что мне придется использовать ostringstream :: rdbuf для копирования данных в потоке из кодирования для декодирования. Это правильный путь? –

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

 Смежные вопросы

  • Нет связанных вопросов^_^