分配给堆

时间:2012-02-23 03:40:29

标签: c++ file heap text-files

我希望能够在一个名为doc.txt的文件中读取任意长度并且不会出现seg错误,我知道我必须在堆上进行分配,但是我很难这样做。我想假装我无法知道文件大小或获取文件大小,只是阅读有多少并分配到堆,我希望唯一的限制是你的机器具有的物理内存的大小。

#include <iostream> 
#include <string>   
#include <fstream>  

using namespace std ;

int main() {

    char *file_name = "doc.txt" ; 

    ifstream fin ;
    fin.open( file_name ) ;

    if( ! fin ) {
         cout << "Problems opening " << file_name << endl ;
         return -1 ;
    }

    const unsigned MAX = 100 ; 
    string doc[MAX] ;

    unsigned word_count = 0 ;
    //while( fin >> doc[ word_count++ ] ) ;

    while( fin >> doc[ word_count ] ) {
         cout << doc[ word_count ] << endl ;
         word_count ++ ;
    }
    fin.close() ;

    return 0 ;
}   

4 个答案:

答案 0 :(得分:2)

如果我理解你在这里做了什么,那么你正在阅读一个名为doc的数组。但是,由于必须静态分配数组,否则您无法实现使其更具动态性的目标。有办法做到这一点,例如使用vector,如此

vector<string> doc;
string newestInput;
while( fin >> newestInput ) {
     cout << newestInput << endl ;
     doc.push_back(newestInput);
}

答案 1 :(得分:1)

只有在您不打算读取整个文件时才提前分配所有空间才有意义。如果确实如此,您有几个选择:

  • 以块(预定长度或行数)读取文件并将其存储在std::list<std::string>中。您也可以使用std::vector<std::string>,但这会重新分配内存,因为它会增长,这可能会导致内存超出严格必要的时间(由于碎片和保持旧的和新的内存块的需要) “在复制元素的同时。”
  • 在Windows下,使用VirtualAlloc 保留等于文件大小的内存量,然后在阅读时逐页提交文件。这样,你永远不会提供比实际需要更多的东西。
  • 在Windows下,使用内存映射文件。

顺便说一句,您可以使用_stat函数以(大部分)便携式方式获取文件大小(阅读st_size字段)。

答案 2 :(得分:0)

您最好的选择可能是使用STL容器,例如vector。这些允许您根据需要动态分配内存。

vector<string> doc;
string word;

while ( !fin.eof() )
{
   fin >> word;
   doc.push_back(word);
   cout << word << end;
}

答案 3 :(得分:0)

您可以使用std::vector并将字词/行存储在那里,这样就不会 知道尺寸。

文件I / O here上有这篇很好的参考文章。在阅读文本文件时,他们会在while( myFile.good() )循环中逐行阅读并使用getline(myFile, line)获取当前行,其中myFile是您的ifstream对象,而line是一个字符串您想要存储当前行。

在示例中,它们只输出当前行,但如果您愿意,也可以将其附加到矢量。

而且,出于好奇,您使用>>运算符是什么?使用getline()无法实现同样的目标吗?