Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file LineReader.h
15 : /// @author Daniel Krajzewicz
16 : /// @author Michael Behrisch
17 : /// @date Fri, 19 Jul 2002
18 : ///
19 : // Retrieves a file linewise and reports the lines to a handler.
20 : /****************************************************************************/
21 : #pragma once
22 : #include <config.h>
23 :
24 : #include <string>
25 : #include <fstream>
26 : #include <utils/common/UtilExceptions.h>
27 :
28 :
29 : // ===========================================================================
30 : // class declarations
31 : // ===========================================================================
32 : class LineHandler;
33 :
34 :
35 : // ===========================================================================
36 : // class definitions
37 : // ===========================================================================
38 : /**
39 : * @class LineReader
40 : * @brief Retrieves a file linewise and reports the lines to a handler.
41 : *
42 : * This class reads the contents from a file line by line and report them to
43 : * a LineHandler-derivate.
44 : * @see LineHandler
45 : * @todo No checks are done so far during reading/setting position etc.
46 : * @todo Should not IOError be thrown if something fails?
47 : */
48 : class LineReader {
49 : public:
50 : /// @brief Constructor
51 : LineReader();
52 :
53 :
54 : /** @brief Constructor
55 : *
56 : * Initialises reading from the file with the given name using setFile.
57 : *
58 : * @param[in] file The name of the file to open
59 : * @see setFile
60 : */
61 : LineReader(const std::string& file);
62 :
63 :
64 : /// @brief Destructor
65 : ~LineReader();
66 :
67 :
68 : /** @brief Returns whether another line may be read (the file was not read completely)
69 : * @return Whether further reading is possible
70 : */
71 : bool hasMore() const;
72 :
73 :
74 : /** @brief Reads the whole file linewise, reporting every line to the given LineHandler
75 : *
76 : * When the LineHandler returns false, the reading will be aborted
77 : *
78 : * @param[in] lh The LineHandler to report read lines to
79 : */
80 : void readAll(LineHandler& lh);
81 :
82 :
83 : /** @brief Reads a single (the next) line from the file and reports it to the given LineHandler
84 : *
85 : * When the LineHandler returns false, the reading will be aborted
86 : *
87 : * @param[in] lh The LineHandler to report read lines to
88 : * @return Whether a further line exists
89 : */
90 : bool readLine(LineHandler& lh);
91 :
92 :
93 : /** @brief Reads a single (the next) line from the file and returns it
94 : *
95 : * @return The next line in the file
96 : */
97 : std::string readLine();
98 :
99 :
100 : /// @brief Closes the reading
101 : void close();
102 :
103 :
104 : /** @brief Returns the name of the used file
105 : * @return The name of the opened file
106 : */
107 : std::string getFileName() const;
108 :
109 :
110 : /** @brief Reinitialises the reader for reading from the given file
111 : *
112 : * Returns false when the file is not readable
113 : *
114 : * @param[in] file The name of the file to open
115 : * @return Whether the file could be opened
116 : */
117 : bool setFile(const std::string& file);
118 :
119 :
120 : /** @brief Returns the current position within the file
121 : * @return The current position within the opened file
122 : */
123 : unsigned long getPosition();
124 :
125 :
126 : /// @brief Reinitialises the reading (of the previous file)
127 : void reinit();
128 :
129 :
130 : /** @brief Sets the current position within the file to the given value
131 : *
132 : * @param[in] pos The new position within the file
133 : */
134 : void setPos(unsigned long pos);
135 :
136 :
137 : /** @brief Returns the information whether the stream is readable
138 : * @return Whether the file is usable (good())
139 : */
140 : bool good() const;
141 :
142 :
143 : int getLineNumber() {
144 163 : return myLinesRead;
145 : }
146 :
147 : private:
148 : /// @brief the name of the file to read the contents from
149 : std::string myFileName;
150 :
151 : /// @brief the stream used
152 : std::ifstream myStrm;
153 :
154 : /// @brief To override MSVC++-bugs, we use an own getline which uses this buffer
155 : char myBuffer[1024];
156 :
157 : /// @brief a string-buffer
158 : std::string myStrBuffer;
159 :
160 : /// @brief Information about how many characters were supplied to the LineHandler
161 : int myRead;
162 :
163 : /// @brief Information how many bytes are available within the used file
164 : int myAvailable;
165 :
166 : /// @brief Information how many bytes were read by the reader from the file
167 : int myRread;
168 :
169 : /// @brief Information how many lines were read for meaningful error messages
170 : int myLinesRead;
171 :
172 : /// @brief Number of skipped characters at the file begin (UTF-8 BOM)
173 : int mySkipBOM;
174 : };
|