C++ 解析未知大小的字符串

C++ 解析未知大小的字符串,c++,ifstream,C++,Ifstream,我试图从文本文件中读取未知大小的字符串,我使用了以下代码: ifstream inp_file; char line[1000] ; inp_file.getline(line, 1000); 但我不喜欢它,因为它有一个限制(即使我知道很难超过这个限制),但我想实现一个更好的代码,它会根据即将到来的字符串的大小进行重新分配。以下是一些可用的选项: istream& getline ( istream& is, string& str, char delim ); ist

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

ifstream inp_file;
char line[1000] ;
inp_file.getline(line, 1000);
但我不喜欢它,因为它有一个限制(即使我知道很难超过这个限制),但我想实现一个更好的代码,它会根据即将到来的字符串的大小进行重新分配。

以下是一些可用的选项:

istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );

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

也许您可以考虑使用哪种灵活的扫描仪来解析输入流?这样你就可以在不需要事先知道的情况下输入任意大小的输入线。。。例如,使用正则表达式表示法

^.+$

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

看看boost::iostreams。

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

  • 将缓冲区中的最后一个字符设置为
    '\0'
  • 调用
    fgets()
  • 检查最后一个字符,看它是否仍然是
    '\0'
    • 如果它不是
      '\0'
      ,也不是
      '\n'
      ,则表示尚未完成一行的读取。分配一个新的缓冲区并将数据复制到这个新的缓冲区中,然后返回到上面的步骤(1)
    • 如果已经分配了缓冲区,请调用
      realloc()
      使其更大。否则,你就完了。返回分配的缓冲区中的数据

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

    为什么不使用
    std::string
    呢?is和str将有一个固定的大小,我需要一个根据输入大小重新分配的解决方案。@Ahmed,这些函数可以读取unil string::max_size()元素。@Ahmed:如果使用std::getline()和std::string那么唯一实际的限制就是可用内存。你有比这更大的台词吗?:)它工作得很好。我不知道这个getline和另一个getline之间的区别,但现在我明白了。内存映射在这里帮不了你。你仍然需要知道要映射的文件的大小。好的,我想你可以这样做。但考虑到标准库中有一个解决方案,这听起来像是大刀阔斧。