Почему моя программа перестала работать? Мои указатели не правы? - PullRequest
0 голосов
/ 12 апреля 2011

Я работаю над программой, которая читает некоторые данные из файла, отформатированного так:

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 чисел - впараллельный массив двумерных указателей, но по какой-то причине каждый раз, когда я запускаю свой код, он просто перестает работать.Это не возвращает ошибку, но я чувствую, что мое использование указателя неправильно, потому что я впервые использую указатели.Файл данных называется "lection_data_121.txt ", к вашему сведению.Вот код.Если бы кто-нибудь мог взглянуть, я был бы так благодарен:

#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 ]

4 голосов
/ 12 апреля 2011

Этот код вообще не нуждается в указателях;почему вы думаете, что это делает?Просто измените типы precinct_num и num_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 голос
/ 12 апреля 2011

Да, похоже, ваше понимание указателей неверно. Я не понимаю, почему вы здесь используете указатель синтаксиса. Просто удалите определения и разыменования указателя, и он должен делать то, что вы хотите. Вы объявляете массив указателей на целые. То есть каждый элемент массива содержит указатель на int, а не на int. Ваш код, кажется, хочет, чтобы каждый элемент массива содержал int.

Я бы посоветовал вам найти хороший учебник по указателям на C ++.

0 голосов
/ 12 апреля 2011

Вы должны изменить объявление ваших переменных precinct_num и num_votes.Прямо сейчас они являются указателями на массивы.Ошибка, с которой вы сталкиваетесь, заключается в том, что эти указатели ни на что не указывают!Таким образом, вы не хотите указатели для массивов.Вы просто хотите массивы напрямую.Поэтому измените их на:

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

Затем, когда вы читаете значения, вы просто хотите:

dataFile >> precinct_num[counter];

и

dataFile >> num_votes[counter][i];

и т.д ...

Это только аспект указателя.Я не смотрел код в целом, чтобы понять, правильно ли он работает.

0 голосов
/ 12 апреля 2011

Сначала необходимо выделить место для precinct_num и num_votes.Либо используйте malloc / calloc, либо просто поместите его в стек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...