分配给堆
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
字段)以(大部分)可移植的方式获取文件大小。
您的最佳选择可能是使用类似vector
的STL
容器。这些允许您根据需要动态分配内存
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()
就不能做到这一点吗?
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源