0

最初の列が文字列で、残りが数値である入力ファイルがあります。

E2   1880    1   0   67.50   10.50   -1.00   -1.00
E2   1880    1   4   66.50   11.50   -1.00   -1.00
E2   1880    1   8   66.50   11.50   -1.00   -1.00
E2   1880    1   12      65.50   11.50   -1.00   -1.00
E2   1880    1   16      64.50   11.50   -1.00   -1.00
E2   1880    1   20      63.50   12.50   -1.00   -1.00
E2   1880    2   0   63.50   12.50   -1.00   -1.00
E2   1880    2   4   62.50   12.50   -1.00   -1.00
E2   1880    2   8   62.50   12.50   -1.00   -1.00

問題は、入力ファイルを2次元配列に保存する必要があることですが、それを実行しようとすると0しか取得できず、最初の列に数値がないためと思われます..

ここにコード

sprintf(FILE,"test.dat");
IN.open(FILE,ios::in);
if(IN.is_open()){
    while ( IN.good() ) {
        getline (IN,line);
        ++data;
    }   
    data -= 1;
}
IN.clear();
IN.close();

double** buf;
buf = new double* [data];
for(int k=0;k<data;k++) buf[k] = new double[COL];
for(int k=0;k<data;k++){
    for(int j=0;j<COL;j++) buf[k][j] = 0.;
} 

sprintf(FILE,"test.dat");
IN.open(FILE,ios::in);
if(IN.is_open()){   
for(int j=0;j<data;j++){
    for(int k=0;k<COL;k++){ 
        IN >> buf[j][k];    
    }
}
IN.clear();
IN.close();

どうもありがとう!

4

3 に答える 3

2
#include <vector>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;

int main()
{
    vector<vector<double>> data;
    ifstream file("test.dat");
    string line;
    while (getline(file, line))
    {
        data.push_back(vector<double>());
        stringstream ss(line);
        // skip first column
        { string temp; ss >> temp; }
        double value;
        while (ss >> value)
        {
            data.back().push_back(value);
        }
    }

    for (int y = 0; y < data.size(); y++)
    {
        for (int x = 0; x < data[y].size(); x++)
        {
            cout << data[y][x] << " ";
        }
    }
    cout << endl;
}
于 2013-09-05T17:03:07.637 に答える
1

まず第一に、これはあなたの最後の行だけを保存しますline

while ( IN.good() ) {
    getline (IN,line);
    ++data;
} 

そして、それはあなたが望んでいることではないと思います。

ファイルからのデータを配列に保存するには、次を使用します

int j = 0;
int k = 0;
std::string discard;
IN >> discard; // discard first "E2"
while (IN >> buf[k][j]){
     if (j < COL-1) j++;
     else if (k < data){  // whenever j reaches COL - 1
         IN >> discard;   // next element (which is "E2" is discarded)
         j = 0;           // col nr reseted
         k++;             // row nr incremeted
     }
}

このコードは、「E2」を含む列がカウントされていないことを前提としています。

于 2013-09-05T17:04:15.487 に答える
0

ループを次のwhileように変更する必要があります。

while ( std::getline(IN, line) )
于 2013-09-05T17:04:35.060 に答える