0

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

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

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

4

5 回答 5

6

以下是一些可用的选项

istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );
于 2010-09-03T11:42:10.833 回答
2

读取未知大小输入的常用习语之一是在循环中读取已知大小的块,检查是否存在更多输入(即验证您不在感兴趣的行/文件/区域的末尾) ,并扩展缓冲区的大小。虽然 getline 原语可能适合您,但对于存储分配由程序员决定的语言中的许多任务来说,这是一种非常通用的模式。

于 2010-09-03T11:45:08.217 回答
0

也许您可以考虑使用re2c,它是一种用于解析输入流的灵活扫描器?通过这种方式,您可以拉入任何大小的输入行,而无需提前知道......例如使用正则表达式表示法

^.+$

一旦被 re2c 捕获,您就可以确定要分配多少内存......

于 2010-09-03T11:50:00.767 回答
0

查看 boost::iostreams 中的内存映射文件

于 2010-09-03T12:10:48.570 回答
0

现在回答可能为时已晚,但仅出于文档目的,另一种读取未知大小行的方法是使用包装函数。在此函数中,您使用fgets()本地缓冲区。

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

这是我在算法讲座中给出的提示。

于 2011-03-04T04:08:51.020 回答