Как мне получить доступ к объекту вне его блока? - PullRequest
0 голосов
/ 26 октября 2018

Эй, я пытаюсь выяснить, как получить доступ к объекту за пределами блока. Я определил Person personData в цикле For, который записывает данные в файл. И после цикла я хотел снова получить доступ к объекту, чтобы обновить значения в файле, но он выдает мне ошибку - personData - неопределенный идентификатор.

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
#include "Person.h"

using namespace std;

int main() {

    string lastName;
    string firstName;
    int age;

    //file output and creation
    ofstream outPerson("nameage.dat", ios::out | ios::binary);

    Person randPerson;

    randPerson.setLastName("unassigned");
    randPerson.setFirstName("");
    randPerson.setAge(0);
    randPerson.setId(0);

    //for loop to initialize the file with 100 records that store values lastName and firstName
    for (int i = 0; i < 100; i++) {
        outPerson.write(reinterpret_cast<const char*>(&randPerson), sizeof(Person));  //use write to output to file 
    }

    cout << "File Created" << endl;

    //file input and termination 
    ifstream inPerson("nameage.dat", ios::in | ios::out | ios::binary);

    //loops through 10 times to input 10 values (RECORD VALUES) 
    for (int j = 0; j < 2; j++) {
        int id = 0;
        do {
            cout << "Enter a valid id number: (1-100)" << endl;
            cin >> id;
        } while ((id<1)||(id>100)); //breaks do-while after it receives a valid input 


        Person personData;

        inPerson.seekg((id - 1) * sizeof(Person));
        inPerson.read(reinterpret_cast<char*>(&personData), sizeof(Person));

        //checks to see if there is already data in that area, if not then proceed to record data onto file 
        if (personData.getId() == 0) {
            cout << "Enter lastname: ";
            cin >> lastName;
            cout << "Enter firstname: ";
            cin >> firstName;
            cout << "Enter age: ";
            cin >> age;

            //sets data for the particular object 
            personData.setLastName(lastName);
            personData.setFirstName(firstName);
            personData.setAge(age);
            personData.setId(id);

            //seek position in file of user-specified record 
            outPerson.seekp((personData.getId() - 1) * sizeof(Person));

            //write user-specified information in file 
            outPerson.write(reinterpret_cast<const char*>(&personData), sizeof(Person));

            cout << "Record inserted" << endl;
        }
        else {
            cout << "There is already data there. Try another ID number" << endl;
        }//end if
    }//end for loop


    int idSearch;

    do {
        cout << "Enter a ID number: " << endl;
        cin >> idSearch;
    } while ((idSearch < 1) || (idSearch > 100));

    if (personData.getId() != 0) {
        cout << "Enter new Last name";
        cin >> lastName;
        cout << "Enter new first name";
        cin >> firstName;
        cout << "Enter age";
        cin >> age;

        //sets data for the particular object 
        personData.setLastName(lastName);
        personData.setFirstName(firstName);
        personData.setAge(age);
        personData.setId(idSearch);

        //seek position in file of user-specified record 
        outPerson.seekp((personData.getId() - 1) * sizeof(Person));

        //write user-specified information in file 
        outPerson.write(reinterpret_cast<const char*>(&personData), sizeof(Person));

        cout << "Record updated" << endl;
    }

    inPerson.read(reinterpret_cast<char*>(&personData), sizeof(Person));





    system("pause");
    return 0;
}

Я предполагаю, что проблема в том, что к объекту нельзя получить доступ, когда он находится вне области видимости. Так как же мне получить доступ к объекту из оператора под циклом for? Спасибо.

1 Ответ

0 голосов
/ 26 октября 2018

Это одна из основных идей модели данных C ++: данные удаляются, как только они выходят за рамки.

Чтобы это работало, вам нужно изменить область действия personData (например, переместить определение переменной за пределы цикла).

Но будьте осторожны, используя что-то подобное. В самом лучшем случае personData будет хранить данные, оставленные последней итерацией цикла.

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