为什么我的程序停止工作?我的指针错了吗?

时间:2011-04-12 01:49:01

标签: c++ pointers

我正在开发一个程序,该程序从如下格式的文件中读取一些数据:

21
285 270 272 126 160 103 1
31 
198 180 163 89 94 47 1 
32
240 230 208 179 163 104 1
33
15 13 12 14 15 15 0
34
63 61 62 24 23 20 2

我正在尝试将第一个数字读入一个指针数组,将其他7个数字读入并行二维指针数组但由于某种原因,每次运行我的代码时它都会停止工作。它没有返回错误,但我觉得我的指针用法是错误的,因为这是我第一次使用指针。数据文件名为“election_data_121.txt”,fyi。继承人的代码。如果有人可以看看我会非常感激:

#include <iostream>
#include <fstream>
using namespace std;

//bool openFileIn(fstream &, char *);

int main()
{
    const int PREC_SIZE = 30;
    const int CANIDATES = 7;
    int *precinct_num[PREC_SIZE];
    int *num_votes[PREC_SIZE][CANIDATES];
    cout << "Declarations made." << endl;

    fstream dataFile; //Make a file handle
    cout << "File object made." << endl;
    //Open the file and check that it opened correctly
    if(!openFileIn(dataFile, "election_data_121.txt"))
    {
        cout << "File open error!" << endl;
        return 0; //Exit the program
    }

    cout << "File opened." << endl;

    //Read the contents of the file into the proper arrays
    int counter = 0;
    while(!dataFile.eof()) 
    {
        dataFile >> *precinct_num[counter];
        for(int i = 0; i < 7; i++)
        {
            dataFile >> *num_votes[counter][i];
        }
        counter++;
    }

    //Print out the data
    for(int j = 0; j < counter; j++)
    {
        cout << *precinct_num[j];
        for(int i = 0; i < 7; i++)
        {
            cout << *num_votes[j][i];
        }
    }

    dataFile.close();
    cout << "End of file";
    return 0;
}

bool openFileIn(fstream &file, char *name)
{
    file.open(name, ios::in);
    if(file.fail())
        return false;
    else
        return true;
}

再次感谢!

4 个答案:

答案 0 :(得分:4)

这段代码根本不需要指针;为什么你会这么想?只需更改precinct_numnum_votes的类型并停止取消引用它们,我认为(一目了然)它应该没问题。

#include <iostream>
#include <fstream>
using namespace std;

//bool openFileIn(fstream &, char *);

int main()
{
    const int PREC_SIZE = 30;
    const int CANIDATES = 7;
    int precinct_num[PREC_SIZE];
    int num_votes[PREC_SIZE][CANIDATES];
    cout << "Declarations made." << endl;

    fstream dataFile; //Make a file handle
    cout << "File object made." << endl;
    //Open the file and check that it opened correctly
    if(!openFileIn(dataFile, "election_data_121.txt"))
    {
        cout << "File open error!" << endl;
        return 0; //Exit the program
    }

    cout << "File opened." << endl;

    //Read the contents of the file into the proper arrays
    int counter = 0;
    while(!dataFile.eof()) 
    {
        dataFile >> precinct_num[counter];
        for(int i = 0; i < 7; i++)
        {
            dataFile >> num_votes[counter][i];
        }
        counter++;
    }

    //Print out the data
    for(int j = 0; j < counter; j++)
    {
        cout << precinct_num[j];
        for(int i = 0; i < 7; i++)
        {
            cout << num_votes[j][i];
        }
    }

    dataFile.close();
    cout << "End of file";
    return 0;
}

bool openFileIn(fstream &file, char *name)
{
    file.open(name, ios::in);
    return !file.fail();
}

答案 1 :(得分:1)

是的,看起来你对指针的理解是有缺陷的。我不明白为什么你在这里使用指针语法。只需删除指针定义和解引用,它应该做你想要的。您正在声明一组指向int的指针。也就是说,数组的每个元素都包含一个指向int而不是int的指针。您的代码似乎希望每个数组元素都包含一个int。

我建议你查阅一篇关于C ++指针的好教程。

答案 2 :(得分:0)

首先需要为precinct_num和num_votes分配一些空间。使用malloc / calloc或者只是将它放在堆栈上。

答案 3 :(得分:0)

您应该更改precinct_num和num_votes变量的声明。现在它们是指针到数组。你遇到的错误是这些指针并没有指向任何东西!所以你不希望指针到数组。你只需要直接使用数组。所以将它们改为:

int precinct_num[PREC_SIZE];
int num_votes[PREC_SIZE][CANIDATES];

然后,当您阅读这些值时,您只想:

dataFile >> precinct_num[counter];

dataFile >> num_votes[counter][i];

等...

这只是指针方面。我没有看过一般的代码,看看它是否正在做正确的事情。