我希望能够在一个名为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 ;
}
答案 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>
,但这会重新分配内存,因为它会增长,这可能会导致内存超出严格必要的时间(由于碎片和保持旧的和新的内存块的需要) “在复制元素的同时。”顺便说一句,您可以使用_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()
无法实现同样的目标吗?