Почему мой Node tempNode не может отображать правильные данные? - PullRequest
0 голосов
/ 07 мая 2018

У меня небольшая проблема с моей программой. У меня есть функция void loadData(), которая загружает данные из текстового файла customers.txt и сохраняет каждую строку данных в связанном списке. Меня беспокоит, в частности, как работает ввод / вывод. Мне удалось получить данные из текстового файла и сохранить их в переменной-члене связанного списка. Когда я вызываю эту переменную, я получаю ответ, который хочу напечатать на консоли. std::cout << "Group Name: " << tempCustomer->groupName << std::endl;

Однако позже я решил запустить консольную команду вывода в функции, чтобы проверить, все ли переменные имели правильные данные, я понимаю, что это было повсеместно. Я не уверен, почему это не работает.

Вот функция loadData()

void Groups::loadData(){
  fin.open("customers.txt"); 
  char holder[MAX_SIZE];

  if(!fin.is_open())
    std::cerr << "Could not access file" << std::endl;
  else{
    while(!fin.eof()){
        Customers *tempCustomer = new Customers;

        fin.getline(holder,MAX_SIZE,';');
        tempCustomer->groupName = holder;

        std::cout << "Group Name: " << tempCustomer->groupName << std::endl;
        fin.getline(holder,MAX_SIZE,';');
        tempCustomer->name = holder;

        fin.getline(holder,MAX_SIZE,';');
        tempCustomer->email = holder;


        fin >> tempCustomer->choice;
        fin.get(); //gets the last character, which is '\n'
        fin.ignore(); //ignores the next character which is the '\n'

        tempCustomer->next = NULL;

        std::cout << "What does the temp Node Store?" << std::endl;
        std::cout << "Group Name: " << tempCustomer->groupName << std::endl;
        std::cout << "Name: " << tempCustomer->name << std::endl;
        std::cout << "Email: " << tempCustomer->email << std::endl;
        std::cout << "Choice: " << tempCustomer->choice << std::endl;

        //addCustomerToLL(tempCustomer);
        tempCustomer = NULL;
        delete tempCustomer;

    }    
   }
   fin.close();
  }

Вот консоль, поставленная:

Group Name: Jonathan Group
What does the temp Node Store?
Group Name: vazquez.jonathan@pcc.edu
Name: vazquez.jonathan@pcc.edu
Email: vazquez.jonathan@pcc.edu
Choice: 2

Вот текстовый файл customers.txt

Jonathan Group;Jonathan;vazquez.jonathan@pcc.edu;2

Это школьное задание, я должен хранить всех клиентов из текстового файла в связанном списке. Я также использую строки c в качестве строк, а не версию строк на c ++. Дайте мне знать, если другие файлы необходимы, я не включил их, так как в этой функции ничего не используется, кроме как в закрытой переменной ifstream fin;, которую я имею в классе, и в глобальной переменной const int MAX_SIZE = 256;.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Если вы не можете использовать std::string, вам нужно выделить память для каждой строки.

Так замените это:

fin.getline(holder,MAX_SIZE,';');
tempCustomer->groupName = holder;

с:

fin.getline(holder, MAX_SIZE, ';');
char *s = new char[strlen(holder) + 1];
strcpy(s, holder);
tempCustomer->groupName = s;

Вы должны освободить выделенную память, когда она вам больше не нужна, поэтому создайте деструктор для вашего Customers класса:

Customers::~Customers()
{
    delete[] groupName;
}
0 голосов
/ 07 мая 2018

Это потому, что holder изменяется, когда вы читаете новую строку, но вся ваша строка в вашем Customer указывает на тот же holder, в котором хранится последняя прочитанная вами строка. Измените тип name, email и т. Д. На char[MAX_SIZE]. Может помочь.

...