将数据从文件存储到数组

时间:2017-04-07 12:41:20

标签: c++ arrays file

我编写了以下代码来读取从文件(area.inp)到数组的列中的数据。在屏幕上显示数据时,第一个" for"循环显示正确的数字(所以代码正确读取文件中的数字),但第二个" for"循环显示不正确的数字集。我无法理解这个问题。我很感激有关这个问题的任何指导。

area.inp

001.000    003.000
002.000    004.000
006.000    005.000
004.000    002.000
002.000    001.000

#include <iostream>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <iterator>


using namespace std;


int main(int argc, char **argv)
{
    int j=0;
    double X[j];
    double Y[j];
    static double *p;
    double *q;
    p=X;
    q=Y;


//**** Counting the number of lines

    ifstream myfile("area.inp");
    myfile.unsetf(ios_base::skipws);

    int points = count(
        istream_iterator<char>(myfile),
        istream_iterator<char>(),
        '\n');

    cout << "Number of data in file: " << points << "\n";

//****  Open data file and result
    cout <<"file is open"<< endl;
    ifstream infile;
    infile.open("area.inp", ios::in);


    cout <<"Reading data from file"<< endl; 
    for (j=0; j<points; j++)
        {
            cout << std::setprecision(3) << std::fixed;;

            infile >> X[j] >> Y[j];

            cout << "Value of X["<<j<<"]: " << X[j] << endl;

            cout << "Value of Y["<<j<<"]: " << Y[j] << endl;
        }

    cout <<"Showing numbers stored in array"<< endl;


            for (j=0; j<points; j++)
            {

                cout << "Value of X["<<j<<"]: " << X[j] << endl;

                cout << "Value of Y["<<j<<"]: " << Y[j] << endl;
            }

    infile.close();

    return 0;
}

Number of data in file: 5
file is open
Reading data from file
Value of X[0]: 1.000
Value of Y[0]: 3.000
Value of X[1]: 2.000
Value of Y[1]: 4.000
Value of X[2]: 6.000
Value of Y[2]: 5.000
Value of X[3]: 4.000
Value of Y[3]: 2.000
Value of X[4]: 2.000
Value of Y[4]: 2.000
Showing numbers stored in array
Value of X[0]: 5.000
Value of Y[0]: 3.000
Value of X[1]: 2.000
Value of Y[1]: 4.000
Value of X[2]: 4.000
Value of Y[2]: 5.000
Value of X[3]: 4.000
Value of Y[3]: 2.000
Value of X[4]: 2.000
Value of Y[4]: 2.000


------------------
(program exited with code: 0)
Press return to continue

2 个答案:

答案 0 :(得分:0)

如评论中所述,您正在创建一个0长度的数组。要按照您的方式执行操作,您必须在之后使用new 分配数组,并计算文件中的点数:

double *X = new double[points];
double *Y = new double[points];

然后在程序结束时,使用delete释放内存。

我建议您避免使用数组,而是使用std::vector。在示例中,我使用std::pair来存储点,但您可以更改它。

// Using a vector of pairs
std::vector<std::pair<double, double>> data;

ifstream infile;
infile.open("area.inp");
// You should check here to make sure the file opened ok

// Read the file. No need to know size ahead of time
std::pair<double, double> tmp;
while (infile >> tmp.first >> tmp.second) {
    data.push_back(tmp);
}

// Print the results
std::cout << "Number of pairs: " << data.size() << std::endl;
for (auto p : data) {
    std::cout << p.first << ", " << p.second << std::endl;
}

答案 1 :(得分:0)

您的数组X []和Y []的大小为零。 好奇为什么没有seg错误

尝试更改如下,

#include <iostream>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <iterator>


using namespace std;


int main(int argc, char **argv)
{
int j=0;
static double *p;
double *q;


//**** Counting the number of lines

ifstream myfile("area.inp");
myfile.unsetf(ios_base::skipws);

const int points = count(
    istream_iterator<char>(myfile),
    istream_iterator<char>(),
    '\n');

double X[points];
double Y[points];
p=X;
q=Y;

cout << "Number of data in file: " << points << "\n";

//****  Open data file and result
cout <<"file is open"<< endl;
ifstream infile;
infile.open("area.inp", ios::in);


cout <<"Reading data from file"<< endl; 
for (j=0; j<points; j++)
    {
        cout << std::setprecision(3) << std::fixed;;

        infile >> X[j] >> Y[j];

        cout << "Value of X["<<j<<"]: " << X[j] << endl;

        cout << "Value of Y["<<j<<"]: " << Y[j] << endl;
    }

cout <<"Showing numbers stored in array"<< endl;


        for (j=0; j<points; j++)
        {

            cout << "Value of X["<<j<<"]: " << X[j] << endl;

            cout << "Value of Y["<<j<<"]: " << Y[j] << endl;
        }

infile.close();

return 0;
}