分配给堆

allocate to heap

本文关键字:分配      更新时间:2023-10-16

我想能够读取一个名为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 ;
}   

如果我理解你在这里做什么,那么你正在读取一个名为doc的数组。然而,由于数组必须是静态分配的,因此您无法实现使其更动态的目标。有一些方法可以做到这一点,例如使用vector,就像一样

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

只有当您不打算读取整个文件时,不提前分配所有空间才有意义。如果真的是这样的话,你有两个选择:

  • 以块(预定长度或行)读取文件,并将其存储在std::list<std::string>中。您也可以使用std::vector<std::string>,但这会随着内存的增长而重新分配内存,这可能会导致内存在严格必要的时间之前用完(由于碎片以及在复制元素时需要同时保持新旧内存块"活动")
  • 在Windows下,使用VirtualAlloc保留等于文件大小的内存量,然后在读取文件时逐页提交。这样,你就永远不会做出超出实际需要的承诺
  • 在Windows下,使用内存映射文件

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

您的最佳选择可能是使用类似vectorSTL容器。这些允许您根据需要动态分配内存

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

您可以使用std::vector并将单词/行存储在其中,这样您就不需要来知道大小。

这里有一篇关于文件I/O的很好的参考文章。当读取文本文件时,他们在while( myFile.good() )循环中逐行读取,并使用getline(myFile, line)获得当前行,其中myFile是您的ifstream对象,line是您希望将当前行存储在其中的字符串。

在这个例子中,它们只是输出当前行,但如果你愿意,你也可以将它附加到向量上。

出于好奇,你用>>运算符做什么?getline()就不能做到这一点吗?