acl  3.5.3.0
istream.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <stdlib.h>
4 #include "stream.hpp"
5 
6 namespace acl {
7 
8 class string;
9 
10 /**
11  * 输入流操作类,如果想确切知道输入流是否关闭或出错或读到了文件流的
12  * 尾部,应通过调用 stream->eof() 来进行判断
13  */
14 
15 class ACL_CPP_API istream : virtual public stream
16 {
17 public:
18  istream(void) {}
19  virtual ~istream(void) {}
20 
21  /**
22  * 从输入流中读数据
23  * @param buf {void*} 用户缓冲区
24  * @param size {size_t} 用户缓冲区长度
25  * @param loop {bool} 是否读满 size 后才返回
26  * @return {int} 读操作结果, -1 表示关闭或出错, > 0 表示成功
27  */
28  int read(void* buf, size_t size, bool loop = true);
29 
30  /**
31  * 从输入流读数据直至读到所要求的字符串或出错才返回
32  * @param buf {void*} 用户缓冲区
33  * @param inout {size_t*} 作为参数时 *inout 表示缓冲 buf
34  * 的空间大小,函数返回后记录存储于 buf 中的数据长度
35  * @param tag {const char*} 要求读到的字符串
36  * @param len {size_t} tag 字符串的长度
37  * @return {bool} 是否读到所要求的字符串数据
38  */
39 
40  bool readtags(void *buf, size_t* inout, const char *tag, size_t len);
41 
42  /**
43  * 从输入流中读到一行数据
44  * @param buf {void*} 用户缓冲区
45  * @param size_inout {size_t*} 作为参数时 *size_inout 表示缓冲 buf
46  * 的空间大小,函数返回后记录存储于 buf 中的数据长度
47  * @param nonl {bool} 如果为 true 则会将读到的一行数据尾部的 "\r\n"
48  * 或 "\n" 去掉,*size_inout 存储的数据长度是去掉 "\r\n" 或 "\n" 后
49  * 的长度;否则,保留数据行中的 "\r\n" 或 "\n",同时 *size_inout 存
50  * 储的是包含 "\r\n" 或 "\n" 的数据长度
51  * @return {bool} 是否读到了一行数据, 出错则返回 false; 对文件输入流而
52  * 言,如果读到的数据是最后一部分数据且这部分数据不含 "\r\n" 或 "\n"
53  * 则也会返回 false, 调用者需要检查 *size_inout 值是否大于 0
54  * 来确定是否读到了最后一部分数据
55  */
56  bool gets(void* buf, size_t* size_inout, bool nonl = true);
57 
58  /**
59  * 从输入流中读一个 64 位整数
60  * @param n {acl_int64&} 64 位整数
61  * @param loop {bool} 是否阻塞式读完8个字节
62  * @return {bool} 是否读取成功
63  */
64 #if defined(_WIN32) || defined(_WIN64)
65  bool read(__int64& n, bool loop = true);
66 #else
67  bool read(long long int& n, bool loop = true);
68 #endif
69 
70  /**
71  * 从输入流中读一个 32 位整数
72  * @param n {int&} 32 位整数
73  * @param loop {bool} 是否阻塞式读完4个字节
74  * @return {bool} 是否读取成功
75  */
76  bool read(int& n, bool loop = true);
77 
78  /**
79  * 从输入流中读一个 16 位整数
80  * @param n {short&} 16 位整数
81  * @param loop {bool} 是否阻塞式读完2个字节
82  * @return {bool} 是否读取成功
83  */
84  bool read(short& n, bool loop = true);
85 
86  /**
87  * 从输入流中读取一个字节
88  * @param ch {char&}
89  * @return {bool} 读取是否成功
90  */
91  bool read(char& ch);
92 
93  /**
94  * 从输入流中读数据至缓冲区中
95  * @param s {string*} 缓冲区,内部会首先自动清空该缓冲区
96  * @param loop {bool} 是否阻塞式读满整个缓冲,缓冲区
97  * 的容量为 s.capacity()
98  * @return {bool} 读数据是否成功
99  */
100  bool read(string& s, bool loop = true);
101  bool read(string* s, bool loop = true);
102 
103  /**
104  * 从输入流中读数据至缓冲区中
105  * @param s {string*} 缓冲区,内部会首先自动清空该缓冲区
106  * @param max {size_t} 希望读到的数据的最大值
107  * @param loop {bool} 是否读到要求的 max 字节数为止
108  * @return {bool} 读数据是否成功
109  */
110  bool read(string& s, size_t max, bool loop = true);
111  bool read(string* s, size_t max, bool loop = true);
112 
113  /**
114  * 从输入流中读一行数据至缓冲区中
115  * @param s {string&} 缓冲区,内部会首先自动清空该缓冲区
116  * @param nonl {bool} 是否保留所读行数据中的 "\r\n" 或 "\n"
117  * @param max {size_t} 当该值 > 0 时,该值限定了所读到行的最大值,当
118  * 接收到数据行长度大于该值时,则仅返回部分数据,同时内部会记录警告;
119  * 当该值 = 0 时,则不限制行数据长度
120  * @return {bool} 是否读到了一行数据
121  * 1)如果返回 true 则说明读到了完整一行数据;如果该行数据中只有
122  * "\r\n" 或 "\n",则 s 的内容为空,即:s.empty() == true
123  * 2)如果返回 false 则说明读关闭且未读到一行数据,此时 s 中有可能
124  * 存储着部分数据,需要用 if (s.empty() == true) 判断一下
125  */
126  bool gets(string& s, bool nonl = true, size_t max = 0);
127  bool gets(string* s, bool nonl = true, size_t max = 0);
128 
129  /**
130  * 从输入流中读数据直到读到要求的字符串数据作为分隔符的数据,
131  * 读取的数据的最后部分应该是该字符串
132  * @param s {string&} 缓冲区,内部会首先自动清空该缓冲区
133  * @param tag {const string&} 要求读的字符串数据
134  * @return {bool} 是否读到要求的字符串数据
135  */
136  bool readtags(string& s, const string& tag);
137  bool readtags(string* s, const string& tag);
138 
139  /**
140  * 从输入流中读一个字节数据
141  * @return {int} 所读字节的 ASCII 码值,如果返回值为 -1 则表示对方关闭或
142  * 读出错
143  */
144  int getch(void);
145 
146  /**
147  * 向输入流中放加一个字节的数据
148  * @param ch {int} 一个字符的 ASCII 码值
149  * @return {int} 如果返回值与 ch 值相同则表示正确,否则表示出错
150  */
151  int ugetch(int ch);
152 
153  /**
154  * 尝试性从输入流中读取一行数据
155  * @param buf {string&} 缓冲区
156  * @param nonl {bool} 是否保留所读行数据中的 "\r\n" 或 "\n"
157  * @param clear {bool} 是否内部自动清空 buf 缓冲区
158  * @param max {int} 当该值 > 0 时则设置所读行数据的最大长度以避免本地
159  * 缓冲区溢出
160  * @return {bool} 是否读了一行数据; 如果返回 false 并不表示输入
161  * 流结束,只是表示未读到一个完整行数据,应该通过调用 stream->eof()
162  * 来检查输入流是否关闭,另外,如果仅读到了部分数据,则 buf 会存储
163  * 这些部分数据
164  * 注意:为了防止 buf 缓冲区溢出,调用者调用该方法获得的数据即使不够
165  * 一行数据,应尽量取出 buf 中的数据然后将 buf->clear(),以防止 buf
166  * 内存过大导致缓冲区溢出
167  */
168  bool gets_peek(string& buf, bool nonl = true,
169  bool clear = false, int max = 0);
170  bool gets_peek(string* buf, bool nonl = true,
171  bool clear = false, int max = 0);
172 
173  /**
174  * 尝试性从输入流中读取数据
175  * @param buf {string&} 缓冲区
176  * @param clear {bool} 函数开始时是否内部自动清空 buf 缓冲区
177  * @return {bool} 是否读到数据, 如果返回 false 仅 表示未读完所要求
178  * 的数据长度,应该通过调用 stream->eof() 来检查输入流是否关闭
179  * 注意:为了防止 buf 缓冲区溢出,调用者调用该方法获得的数据即使不够
180  * 一行数据,应尽量取出 buf 中的数据然后将 buf->clear(),以防止 buf
181  * 内存过大导致缓冲区溢出
182  */
183  bool read_peek(string& buf, bool clear = false);
184  bool read_peek(string* buf, bool clear = false);
185 
186  /**
187  * 尝试性从输入流中读取数据
188  * @param buf {void*} 缓冲区
189  * @param size {size_t} buf 缓冲区大小
190  * @return {int} 返回 -1 表示读出错或关闭,> 0 表示读到的数据长度,
191  * 如果返回 0 表示本次没有读到数据,可以继续读,当返回值 < 0 时,
192  * 可通过 eof() 判断流是否应该关闭
193  */
194  int read_peek(void* buf, size_t size);
195 
196  /**
197  * 尝试性从输入流中读取指定长度的数据
198  * @param buf {string&} 缓冲区
199  * @param cnt {size_t} 要求读到的数据长度
200  * @param clear {bool} 函数开始时是否内部自动清空 buf 缓冲区
201  * @return {bool} 是否读到所要求数据长度的数据, 如果返回 false 仅
202  * 表示未读完所要求的数据长度,应该通过调用 stream->eof() 来检查
203  * 输入流是否关闭
204  * 注意:为了防止 buf 缓冲区溢出,调用者调用该方法获得的数据即使不够
205  * 一行数据,应尽量取出 buf 中的数据然后将 buf->clear(),以防止 buf
206  * 内存过大导致缓冲区溢出
207  */
208  bool readn_peek(string& buf, size_t cnt, bool clear = false);
209  bool readn_peek(string* buf, size_t cnt, bool clear = false);
210 
211  /* 以下几个函数重载了输入操作符,它们都是阻塞式操作过程,且需要
212  * 调用 stream->eof() 来判断输入流是否关闭或是否读到了文件尾
213  */
214 
215  istream& operator>>(string& s);
216 #if defined(_WIN32) || defined(_WIN64)
217  istream& operator>>(__int64& n);
218 #else
219  istream& operator>>(long long int& n);
220 #endif
221  istream& operator>>(int& n);
222  istream& operator>>(short& n);
223  istream& operator>>(char& ch);
224 };
225 
226 } // namespace acl
istream(void)
Definition: istream.hpp:18
virtual ~istream(void)
Definition: istream.hpp:19
#define ACL_CPP_API