解析未知大小的字符串

时间:2010-09-03 11:39:46

标签: c++ ifstream

我正在尝试从文本文件中读取未知大小的字符串,我使用了以下代码:

ifstream inp_file;
char line[1000] ;
inp_file.getline(line, 1000);

但我不喜欢它,因为它有一个限制(即使我知道它很难超过这个限制)但我想实现一个更好的代码,根据即将到来的字符串的大小重新分配。

5 个答案:

答案 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()

  1. 将缓冲区中的最后一个字符设置为'\0'
  2. 致电fgets()
  3. 检查最后一个字符,看它是否仍然是'\0'
    • 如果不是'\0'并且它不是'\n',则意味着还没有读完一行。分配一个新缓冲区并将数据复制到这个新缓冲区并返回上面的步骤(1)。
    • 如果已经有分配的缓冲区,请调用realloc()使其变大。否则,你就完成了。将数据返回到已分配的缓冲区中。
  4. 这是我的算法讲座中给出的一个提示。