【问题标题】:Filling vector with columns of unknown length用未知长度的列填充向量
【发布时间】:2018-08-09 18:24:04
【问题描述】:

我想做什么: 使用 .txt 文件中的数据填充向量,该文件包含 3 列未知长度。每个向量的每一列。我也想在屏幕上打印矢量。

代码如下:

using namespace std;
class Equation
{
    vector < vector <double> > u;
    vector< vector <double> > alfa;
    vector < vector <double> > f;
    string fileName;

    public:
    Equation(string fileName);

};
Equation::Equation(string fileName)
{
    cout<< "Give name of the file:" << endl;
    cin >> fileName;

    fstream plik;
    plik.open( fileName.c_str(), ios::in | ios::out );

    if( plik.good() == true )
    {
        cout << "file is open" << endl; 
        bool first = false;
        if (plik) 
        {
            string line;
            while (getline(plik,line)) 
            {
                istringstream split(line);
                double value;
                int col = 0;
                char sep;

                double dummy;
                while (split >> value >> dummy )
                {
                    if(!first)
                    {
                        // Each new value read on line 1 should create a new inner vector
                        u.push_back(vector<double>(value));
                    }
                    u[col].push_back(value);
                    ++col;
                    // read past the separator                
                    split >> sep;
                }
            // Finished reading line 1 and creating as many inner
            // vectors as required            
            first = true;
            }
        }
        // printing content of vector u:
        for (const auto & vec : u) 
        {
            for (const auto elem : vec)
            cout  << elem << ' ';
            cout << '\n';
        }
        // now vector alfa: 
        bool second = false;
        if (plik) 
        {
            string sline; //as second line
            while (getline(plik,sline)) 
            {
                istringstream ssplit(sline); // as second split
                double svalue;
                int scol = 0;
                char ssep;

                while ( ssplit  >> svalue)
                {
                    if(!second)
                    {
                        // Each new value read on line 1 should create a new inner vector
                        alfa.push_back(vector<double>());
                    }
                    alfa[scol].push_back(svalue);
                    ++scol;
                    // read past the separator                
                    ssplit>>ssep;
                }
                // Finished reading line 1 and creating as many inner
                // vectors as required            
                second = true;
            }
        }
        for (const auto & svec : alfa) 
        {
            for (const auto selem : svec)
                cout << "wektor u: " << selem << ' ';
            cout << '\n';
        }
    }
    else 
        cout << "error" << endl;    
}

int main()
{
    Equation("");
    getch();
    return( 0 );
}

有什么问题:

  1. 我输入了“虚拟”变量,因为没有它我的输出是向量 充满了整个文件,但我不知道这是否是正确的解决方案。 现在我的输出是向量 u,其中填充了第一列的值。
  2. 如何用第二列和第三列的值填充其他向量?
  3. 如何处理列(文件)长度未知且可能为任何长度的事实?
  4. 有人能解释一下编译器如何知道何时停止创建和填充内部向量吗?变量 'col' 代表它,但它究竟是如何工作的?

【问题讨论】:

  • 如果您提供输入和所需输出的示例,可能会有所帮助。
  • @mxdg 输入和输出是相同的,因为我应该在这个类中存储数据向量。我只是想确保我正确地填充它们。示例文件只有 3 列由空格分隔的双精度数。

标签: c++ file class c++11 stdvector


【解决方案1】:

如果我没记错的话,这是一个合法的 .txt 文件示例:

info.txt

125.5 1648.2 16325.151
156464.1631 1231.156 0.1
1 231 54832
15236.15 12 0.6414787

在 cpp 中,您可以通过代码中包含适合变量的结构来读取文件。试试下面的代码:

struct DataReader {
    vector<double> a_vec;
    vector<double> b_vec;
    vector<double> c_vec;
};

int main(){

    ifstream file("/path/to/your/file/info.txt");
    DataReader dr;

    double a, b, c;
    while (!file.eof()) {
        file >> a >> b >> c;
        dr.a_vec.push_back(a);
        dr.b_vec.push_back(b);
        dr.c_vec.push_back(c);
    }

    for (size_t i = 0; i < dr.a_vec.size(); i++) {
        cout << dr.a_vec[i] << " " << dr.b_vec[i] << " " << dr.c_vec[i] << endl;
    }

    return 0;
}

【讨论】:

  • @KoreIK 为什么在“for”循环中有“size_t”类型?我读过它,但不是很明白。这与文件长度未知的事实有关吗?另外,非常感谢这么简单的回答!
  • @Uroboros size_tunsigned int 的一个类型,这意味着这个变量不能得到负值。在这种情况下,loop 的工作方式与int i 相同,但是int 类型可以获得很多数字,在vector 长度的情况下毫无意义。 size_t 得到比int 大得多的数字,并且在非常大的向量中,它可能导致您无法到达vector 中的某些地方。使用size_t 就没有这个问题,因为dr.a_vec.size() 返回一个size_t 类型值。
  • 在循环条件中使用 eof() 可能是错误的:stackoverflow.com/questions/5605125/…
猜你喜欢
  • 2013-01-17
  • 2014-01-07
  • 2019-09-03
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2012-10-30
  • 2020-08-14
  • 2021-11-03
相关资源
最近更新 更多