将浮点数读入动态分配的数据,同时在读取文件时增加数组的大小

时间:2012-01-16 20:46:22

标签: c++ arrays file-io

我正在尝试将文件中的浮点数读入动态分配的2D数组中。我正在使用c ++。

在我的.txt文件中,行的元素由制表符空格分隔,每行以新行开头。

我的问题是 -

我可以根据编号增加数组的大小。文件中存在的元素(行和列)?如果是这样,请建议一种方法。

我想写了不。在文本文件的第一行上的行和列,并在开头读取它们以设置将为我的数组分配空间的循环限制。有没有更好的方法,可能基于文本文件的格式?这样,我认为它将更接近流数据类型的场景。

提前致谢。

AKHIL

2 个答案:

答案 0 :(得分:7)

请考虑使用自动调整大小的std::vector,而不是使用数组。在C ++中,这非常适合使用原始数组,因为它更安全并且隐藏了资源管理。

事实上,将std::vector与流库结合使用,可以非常轻松地读取以制表符分隔的浮点值文件:

ifstream input("my-file.txt");
vector<float> myValues;

for (float f; input >> f; )
    myValues.push_back(f);

或者,或者:

ifstream input("my-file.txt");
vector<float> myValues;

myValues.insert(myValues.begin(),
                istream_iterator<float>(input),
                istream_iterator<float>());

但是,上面的代码将读取1D浮点数组,而不是您想要的2D数组。要读取2D数组,一个选项是一次读取文件的一行,然后使用上面代码的修改将该行拆分为单独的浮点数。例如:

ifstream input("my-file.txt");
vector< vector<float> > myValues;

for (string line; getline(input, line); ) {
    stringstream lineStream(line);

    vector<float> thisLine;

    thisLine.insert(thisLine.begin(),
                    istream_iterator<float>(lineStream),
                    istream_iterator<float>());
    myValues.push_back(thisLine);
}

希望这有帮助!

答案 1 :(得分:0)

您无法增加动态分配的数组的大小。事实上,堆上跟随它的内存可能已经被分配给其他内容。

使用自动处理调整大小的数据结构,而不是使用数组,例如嵌套std::vectorstd::list取决于您的需求。