LineReader.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00007 // Retrieves a file linewise and reports the lines to a handler.
00008 /****************************************************************************/
00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00010 // Copyright 2001-2010 DLR (http://www.dlr.de/) and contributors
00011 /****************************************************************************/
00012 //
00013 //   This program is free software; you can redistribute it and/or modify
00014 //   it under the terms of the GNU General Public License as published by
00015 //   the Free Software Foundation; either version 2 of the License, or
00016 //   (at your option) any later version.
00017 //
00018 /****************************************************************************/
00019 
00020 
00021 // ===========================================================================
00022 // included modules
00023 // ===========================================================================
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029 
00030 #include <string>
00031 #include <fstream>
00032 #include <iostream>
00033 #include <algorithm>
00034 #include <sstream>
00035 #include <utils/common/UtilExceptions.h>
00036 #include "LineHandler.h"
00037 #include "LineReader.h"
00038 
00039 #ifdef CHECK_MEMORY_LEAKS
00040 #include <foreign/nvwa/debug_new.h>
00041 #endif // CHECK_MEMORY_LEAKS
00042 
00043 
00044 // ===========================================================================
00045 // method definitions
00046 // ===========================================================================
00047 LineReader::LineReader() throw() {}
00048 
00049 
00050 LineReader::LineReader(const std::string &file) throw()
00051         : myFileName(file),
00052         myRead(0) {
00053     reinit();
00054 }
00055 
00056 
00057 LineReader::~LineReader() throw() {}
00058 
00059 
00060 bool
00061 LineReader::hasMore() const throw() {
00062     return myRread<myAvailable;
00063 }
00064 
00065 
00066 void
00067 LineReader::readAll(LineHandler &lh) throw(ProcessError) {
00068     while (myRread<myAvailable) {
00069         if (!readLine(lh)) {
00070             return;
00071         }
00072     }
00073 }
00074 
00075 
00076 bool
00077 LineReader::readLine(LineHandler &lh) throw(ProcessError) {
00078     std::string toReport;
00079     bool moreAvailable = true;
00080     while (toReport.length()==0) {
00081         size_t idx = myStrBuffer.find('\n');
00082         if (idx==0) {
00083             myStrBuffer = myStrBuffer.substr(1);
00084             myRread++;
00085             return lh.report("");
00086         }
00087         if (idx!=std::string::npos) {
00088             toReport = myStrBuffer.substr(0, idx);
00089             myStrBuffer = myStrBuffer.substr(idx+1);
00090             myRread += idx+1;
00091         } else {
00092             if (myRead<myAvailable) {
00093                 myStrm.read(myBuffer,
00094                             myAvailable - myRead<1024
00095                             ? myAvailable - myRead
00096                             : 1024);
00097                 size_t noBytes = myAvailable - myRead;
00098                 noBytes = noBytes > 1024 ? 1024 : noBytes;
00099                 myStrBuffer += std::string(myBuffer, noBytes);
00100                 myRead += 1024;
00101             } else {
00102                 toReport = myStrBuffer;
00103                 moreAvailable = false;
00104                 if (toReport=="") {
00105                     return lh.report(toReport);
00106                 }
00107             }
00108         }
00109     }
00110     // remove trailing blanks
00111     int idx = (int)toReport.length()-1;
00112     while (idx>=0&&toReport[idx]<32) {
00113         idx--;
00114     }
00115     if (idx>=0) {
00116         toReport = toReport.substr(0, idx+1);
00117     } else {
00118         toReport = "";
00119     }
00120     // give it to the handler
00121     if (!lh.report(toReport)) {
00122         return false;
00123     }
00124     return moreAvailable;
00125 }
00126 
00127 
00128 std::string
00129 LineReader::readLine() throw() {
00130     std::string toReport;
00131     bool moreAvailable = true;
00132     while (toReport.length()==0&&myStrm.good()) {
00133         size_t idx = myStrBuffer.find('\n');
00134         if (idx==0) {
00135             myStrBuffer = myStrBuffer.substr(1);
00136             myRread++;
00137             return "";
00138         }
00139         if (idx!=std::string::npos) {
00140             toReport = myStrBuffer.substr(0, idx);
00141             myStrBuffer = myStrBuffer.substr(idx+1);
00142             myRread += idx+1;
00143         } else {
00144             if (myRead<myAvailable) {
00145                 myStrm.read(myBuffer,
00146                             myAvailable - myRead<1024
00147                             ? myAvailable - myRead
00148                             : 1024);
00149                 size_t noBytes = myAvailable - myRead;
00150                 noBytes = noBytes > 1024 ? 1024 : noBytes;
00151                 myStrBuffer += std::string(myBuffer, noBytes);
00152                 myRead += 1024;
00153             } else {
00154                 toReport = myStrBuffer;
00155                 myRread += 1024;
00156                 moreAvailable = false;
00157                 if (toReport=="") {
00158                     return toReport;
00159                 }
00160             }
00161         }
00162     }
00163     if (!myStrm.good()) {
00164         return "";
00165     }
00166     // remove trailing blanks
00167     int idx = (int)toReport.length()-1;
00168     while (idx>=0&&toReport[idx]<32) {
00169         idx--;
00170     }
00171     if (idx>=0) {
00172         toReport = toReport.substr(0, idx+1);
00173     } else {
00174         toReport = "";
00175     }
00176     return toReport;
00177 }
00178 
00179 
00180 
00181 std::string
00182 LineReader::getFileName() const throw() {
00183     return myFileName;
00184 }
00185 
00186 
00187 bool
00188 LineReader::setFile(const std::string &file) throw() {
00189     myFileName = file;
00190     reinit();
00191     return myStrm.good();
00192 }
00193 
00194 
00195 unsigned long
00196 LineReader::getPosition() throw() {
00197     return myRread;
00198 }
00199 
00200 
00201 void
00202 LineReader::reinit() throw() {
00203     if (myStrm.is_open()) {
00204         myStrm.close();
00205     }
00206     myStrm.clear();
00207     myStrm.open(myFileName.c_str(), std::ios::binary);
00208     myStrm.unsetf(std::ios::skipws);
00209     myStrm.seekg(0, std::ios::end);
00210     myAvailable = myStrm.tellg();
00211     myStrm.seekg(0, std::ios::beg);
00212     myRead = 0;
00213     myRread = 0;
00214     myStrBuffer = "";
00215 }
00216 
00217 
00218 void
00219 LineReader::setPos(unsigned long pos) throw() {
00220     myStrm.seekg(pos, std::ios::beg);
00221     myRead = pos;
00222     myRread = pos;
00223     myStrBuffer = "";
00224 }
00225 
00226 
00227 bool
00228 LineReader::good() const throw() {
00229     return myStrm.good();
00230 }
00231 
00232 
00233 
00234 /****************************************************************************/
00235 

Generated on Wed May 5 00:06:30 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6