我正在尝试从文本文件中读取未知大小的字符串,我使用了以下代码:
ifstream inp_file;
char line[1000] ;
inp_file.getline(line, 1000);
但我不喜欢它,因为它有一个限制(即使我知道它很难超过这个限制)但我想实现一个更好的代码,根据即将到来的字符串的大小重新分配。
答案 0 :(得分:6)
following是一些可用的选项:
istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );
答案 1 :(得分:2)
读取未知大小输入的常用习惯之一是在循环内读取已知大小的块,检查是否存在更多输入(即验证您不在行/文件/区域的末尾感兴趣),并扩展缓冲区的大小。虽然getline原语可能适合您,但对于语言中的许多任务而言,这是一种非常通用的模式,其中存储分配由程序员完成。
答案 2 :(得分:0)
也许您可以查看使用re2c这是一个灵活的扫描程序来解析输入流?通过这种方式,您可以在不必提前知道的情况下拉入任何大小的输入行...例如使用正则表达式
^.+$
一旦被re2c捕获,您就可以确定要分配多少内存......
答案 3 :(得分:0)
在boost :: iostreams中查看memory-mapped files。
答案 4 :(得分:0)
现在回答可能为时已晚,但仅出于文档目的,另一种读取未知大小的行的方法是使用包装函数。在此函数中,您使用本地缓冲区使用fgets()
。
'\0'
fgets()
'\0'
'\0'
并且它不是'\n'
,则意味着还没有读完一行。分配一个新缓冲区并将数据复制到这个新缓冲区并返回上面的步骤(1)。realloc()
使其变大。否则,你就完成了。将数据返回到已分配的缓冲区中。这是我的算法讲座中给出的一个提示。