--- /dev/null
+/////////////////////////////////////////////////////////////////
+// FileBuffer.h
+//
+// Buffered file reading.
+/////////////////////////////////////////////////////////////////
+
+#ifndef FILEBUFFER_H
+#define FILEBUFFER_H
+
+#include <string>
+#include <fstream>
+#include <iostream>
+
+using namespace std;
+
+const int BufferSize = 1000;
+
+/////////////////////////////////////////////////////////////////
+// FileBuffer
+//
+// Class for buffering file reading.
+/////////////////////////////////////////////////////////////////
+
+class FileBuffer {
+ ifstream file;
+ char buffer[BufferSize];
+ int currPos;
+ int size;
+ bool isEOF;
+ bool isValid;
+ bool canUnget;
+
+public:
+
+ // Some common routines
+
+ FileBuffer(const char *filename) :
+ file(filename), currPos(0), size(0), isEOF(false), isValid(
+ !file.fail()), canUnget(false) {
+ }
+ ~FileBuffer() {
+ close();
+ }
+ bool fail() const {
+ return !isValid;
+ }
+ bool eof() const {
+ return (!isValid || isEOF);
+ }
+ void close() {
+ file.close();
+ isValid = false;
+ }
+
+ /////////////////////////////////////////////////////////////////
+ // FileBuffer::Get()
+ //
+ // Retrieve a character from the file buffer. Returns true if
+ // and only if a character is read.
+ /////////////////////////////////////////////////////////////////
+
+ bool Get(char &ch) {
+
+ // check to make sure that there's more stuff in the file
+ if (!isValid || isEOF)
+ return false;
+
+ // if the buffer is empty, it's time to reload it
+ if (currPos == size) {
+ file.read(buffer, BufferSize);
+ size = file.gcount();
+ isEOF = (size == 0);
+ currPos = 0;
+ if (isEOF)
+ return false;
+ }
+
+ // store the read character
+ ch = buffer[currPos++];
+ canUnget = true;
+ return true;
+ }
+
+ /////////////////////////////////////////////////////////////////
+ // FileBuffer::UnGet()
+ //
+ // Unretrieve the most recently read character from the file
+ // buffer. Note that this allows only a one-level undo.
+ /////////////////////////////////////////////////////////////////
+
+ void UnGet() {
+ assert(canUnget);
+ assert(isValid);
+ assert(currPos > 0);
+ currPos--;
+ assert(currPos < size);
+ isEOF = false;
+ canUnget = false;
+ }
+
+ /////////////////////////////////////////////////////////////////
+ // FileBuffer::GetLine()
+ //
+ // Retrieve characters of text until a newline character is
+ // encountered. Terminates properly on end-of-file condition.
+ /////////////////////////////////////////////////////////////////
+
+ void GetLine(string &s) {
+ char ch;
+ s = "";
+ while (Get(ch) && ch != '\n')
+ s += ch;
+ }
+
+};
+
+#endif