From 2467c3261e2cd1019e4eb8b0a7cc983460490cd0 Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Wed, 6 Apr 2011 12:03:51 +0200 Subject: [PATCH] [Positioning] TextFileReader: '-' for stdin The user can now use '-' as file name to read inputs from stdin. --- owlps-positioning/src/textfilereader.cc | 21 +++++++++++++++++---- owlps-positioning/src/textfilereader.hh | 10 +++++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/owlps-positioning/src/textfilereader.cc b/owlps-positioning/src/textfilereader.cc index 6ae90c6..9f9f2cb 100644 --- a/owlps-positioning/src/textfilereader.cc +++ b/owlps-positioning/src/textfilereader.cc @@ -1,6 +1,8 @@ #include "textfilereader.hh" #include "posexcept.hh" +#include + using namespace std ; @@ -15,15 +17,26 @@ using namespace std ; TextFileReader::TextFileReader(const string &_file_name): file_name(_file_name), current_line_nb(0) { - file.open(file_name.c_str()) ; - if (! file) - throw error_opening_input_file(file_name) ; + if (file_name == "-") + { + file_buf = file.rdbuf() ; + file.std::ios::rdbuf(std::cin.rdbuf()) ; + } + else + { + file.open(file_name.c_str()) ; + if (! file) + throw error_opening_input_file(file_name) ; + } } TextFileReader::~TextFileReader() { - file.close() ; + if (file_name == "-") + file.std::ios::rdbuf(file_buf) ; + else + file.close() ; } diff --git a/owlps-positioning/src/textfilereader.hh b/owlps-positioning/src/textfilereader.hh index 9a55f53..7b5fdae 100644 --- a/owlps-positioning/src/textfilereader.hh +++ b/owlps-positioning/src/textfilereader.hh @@ -4,12 +4,20 @@ #include #include -/// Read text from a file, line by line +/// Reads text from a file, line by line +/** + * If the file name is a dash ('-'), the standard input is used. + */ class TextFileReader { protected: + /// Name of the input file std::string file_name ; + /// Stream associated with the file std::ifstream file ; +/// Original rdbuf of the stream + std::streambuf *file_buf ; + /// Number of the last line read unsigned int current_line_nb ; /// Checks if the file is readable and closes it if not