C ++从文件中读取数字并存储在向量中

时间:2010-09-15 23:47:54

标签: c++ file input

我无法“撤消”这种方法,它基本上将一个可变大小的数字矩阵转储到文本文件中:

void vectorToFile(char *name, vector<vector<double>>* a){
    FILE* fp = fopen(name, "w");
    for(int i=0;i<a->size();i++){
        for(int j=0;j<a->at(i).size();j++){
            fprintf(fp, "%f ", a->at(i).at(j));
        }
        fprintf(fp, "\n");
    }
    fclose(fp);
}

我在实施反向时遇到了麻烦:

vector<vector<double>> fileToVector(char *name){ ??? }

我保证文件中的数字形成一个“矩形”,即内部向量的大小都相等,但我不知道如何计算每行的条目数和列数

有人能指出我正确的方向吗?到目前为止,我发现的每个例子都使用硬编码的大小或第一行中给出的大小(不幸的是我无法负担)实现更容易的东西

5 个答案:

答案 0 :(得分:10)

我是C ++的新手,所以我不确定这是不是一个好方法,但我会打开文件,逐行读入输入,在读取时解析每一行。这是一些示例代码(未经测试,未编译):

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>

std::vector<std::vector<double> > fileToVector(const char *name)
{
    std::vector<std::vector<double> > result;
    std::ifstream input (name);
    std::string lineData;

    while(getline(input, lineData))
    {
        double d;
        std::vector<double> row;
        std::stringstream lineStream(lineData);

        while (lineStream >> d)
            row.push_back(d);

        result.push_back(row);
    }

    return result;
}

答案 1 :(得分:2)

您可以尝试更多C ++方法:

void vectorToFile(std::vector<double> const& vec, std::string const& filename) {
    std::ofstream file(filename);
    if(file.good()) {
        file.flags(std::ios::fixed);
        std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(file));
    } else {
        // throw error or sth
    }
    file.close();
}

如果您想保存为二进制文件,可以像这样使用ostream_binary_iterator - http://bit.ly/9JAxdp

void vectorToFile(std::vector<double> const& vec, std::string const& filename) {
    std::ofstream file(filename, std::ios::binary);
    if(file.good()) {
        file.flags(std::ios::fixed);
        std::copy(vec.begin(), vec.end(), ostream_binary_iterator<double>(file));
    } else {
        // throw error or sth
    }
    file.close();
}

答案 2 :(得分:1)

如果使用C ++ I / O而不是C I / O会更容易。我建议使用ifstream来读取文件并使用getline()来读取每一行。然后每一行都应该是vector中的数字。解析string的最简单方法可能是使用stringstream。然后,您可以将每个doublepush_back()解析为vector,这样您就不必关心vectors的大小了。我还建议您尽可能使用std::string而不是char*(尽管对于文件名,您通常最终必须在它们上使用c_str(),因为文件I / O的东西似乎总是采用const char*代替std::string)。

答案 3 :(得分:0)

您可以使用您拥有的分隔符读取行,然后解析为数字。 您可以使用getline将行读取为字符串,您无需知道确切的数字。

答案 4 :(得分:-2)

使用载体是否有任何特殊原因&gt;而不是只使用double **并使用new double []来分配数组和每个子元素?我的猜测是数组可以在运行时动态调整大小,但是如果数组只分配一次,那么使用double **必然比迭代向量更有效。

在任何情况下,您的问题的解决方案是将数组的边界预先转储到文件中并将其读回...