--- /dev/null
+//start id=namespace
+#include "qstd.h"
+
+/* QTextStreams look a lot like iostreams,
+we just have to point them to the right place. */
+
+//start id=streamdefs
+QTextStream qstd::cin(stdin, QIODevice::ReadOnly);
+QTextStream qstd::cout(stdout, QIODevice::WriteOnly);
+QTextStream qstd::cerr(stderr, QIODevice::WriteOnly);
+//end
+
+
+/* Namespace members are like static class members */
+bool qstd::yes(QString question) {
+ QString ans;
+ cout << QString(" %1 [y/n]? ").arg(question);
+ cout.flush();
+ ans = cin.readLine();
+ return (ans.toUpper().startsWith("Y", Qt::CaseInsensitive));
+}
+//end
+
+bool qstd::more(QString s) {
+ return yes(QString("Another %1").arg(s));
+}
+
+
+int qstd::promptInt(int base /* =10 */) { /* Usage: int n = promptInt(); */
+ QString numstr;
+ int result;
+ bool ok;
+ cout << ": " << flush;
+ while (1) {
+ numstr = cin.readLine();
+ result = numstr.toInt(&ok, base);
+ if (!ok) {
+ cout << "Invalid number. Try again: ";
+ cout.flush();
+ }
+ else
+ return result;
+ }
+}
+
+
+double qstd::promptDouble() { /* Usage: double d = promptDouble(); */
+ QString numstr;
+ double result;
+ bool ok;
+ while (1) {
+ numstr = cin.readLine();
+ result = numstr.toDouble(&ok);
+ if (!ok) {
+ cout << "Invalid number. Try again: ";
+ cout.flush();
+ }
+ else
+ return result;
+ }
+}
+
+
+void qstd::promptOutputFile(QFile& outfile) {
+ QString filename;
+ while (1) {
+ cout << "Please enter the file name for saving this data: ";
+ cout.flush();
+ filename = cin.readLine();
+ outfile.setFileName(filename);
+ bool fileExists = outfile.open(QIODevice::ReadOnly);
+ if (!fileExists)
+ break;
+ if (yes("File already exists ... Ok to overwrite"))
+ break;
+ outfile.close();
+ outfile.reset();
+ }
+ outfile.close();
+ outfile.reset();
+ outfile.open(QIODevice::WriteOnly);
+ cout << filename << " open for writing ...\n";
+ cout.flush();
+}
+
+
+void qstd::promptInputFile(QFile& infile) {
+ QString filename;
+ while (1) {
+ cout << "Name of the file to be read: ";
+ cout.flush();
+ filename = cin.readLine();
+ infile.setFileName(filename);
+ bool fileExists = infile.open(QIODevice::ReadOnly);
+ if (fileExists)
+ break;
+ cout << "File does not exist ... Please try again. \n";
+ cout.flush();
+ infile.reset();
+ }
+ cout << filename << " open for reading ...\n";
+ cout.flush();
+}
+
--- /dev/null
+#ifndef QSTD_H
+#define QSTD_H
+
+#include <QTextStream>
+#include <QFile>
+#include <QString>
+
+/** @short helper objects and functions which help reduce the
+ need for char[] and the standard library.
+
+ defines three @ref QTextStream instances
+ which behave like the c++ standard iostreams, bound to the
+ standard in/out/error.
+
+ Also provided, some helper functions for writing
+ interactive stdin/stdout applications.
+*/
+//start
+namespace qstd {
+
+ /** @short An alias for standard input
+ */
+ extern QTextStream cin; /* declared only, defined in the .cpp file */
+ /** @short An alias for standard output
+ */
+ extern QTextStream cout;
+ /** @short An alias for standard error
+ */
+ extern QTextStream cerr;
+ /** yes/no prompt
+ interactive stdin UI - prompts user with
+ a yes/no question. Repeatedly-asks
+ until user supplies a valid answer.
+
+ @param yesNoQuestion the yes/no question
+ @return true/false depending on what the
+ user responded.
+ */
+ bool yes(QString yesNoQuestion);
+ /** Convenience function that feeds a specific question
+ to the yes() function.
+ @usage do {.....} while(more ("foobar"));
+ so that user sees the question: "Another foobar (y/n)? "
+ @param name of the item being handled by the loop.
+ */
+ bool more(QString prompt);
+ /** A function for safely taking an int from the keyboard.
+ Takes data into a QString and tests to make sure it
+ can be converted to int before returning.
+ @param base allows choice of number base.
+ @return returns validated int.
+ */
+ int promptInt(int base = 10);
+ /** A function for safely taking a double from the keyboard.
+ Takes data into a QString and tests to make sure it
+ can be converted to double before returning.
+ @return returns validated int.
+ */
+ double promptDouble();
+ /** Complete dialog for opening a file for output.
+ Asks user for file name, checks to see if
+ file already exists and, if so, asks the user if
+ it is ok to overwrite.
+ @param Reference QFile parameter is set to point
+ to the (eventually) opened file.
+ */
+ /** @short Dialog for a output file prompt
+ */
+ void promptOutputFile(QFile& outfile);
+
+ /** @short Dialog for input file prompt */
+ void promptInputFile(QFile& infile);
+
+
+//end
+}
+
+#endif
+