我的函数不接管其他函数的变量值

时间:2019-05-15 15:27:12

标签: c++ string

我有一个程序可以在文件中创建电话簿。我的某些功能无法正常工作。

user.h

#pragma once
#include <string>
#include <vector>
using namespace std;
class User
{private:
   string firstname, lastname, country, city, street;
   string phone;
public:
    string prefix;
  void ReadAllUsers(User[], int&);
  void SaveUser(User, int&);
  void SaveToFile(const User[], int);
  void AddName(User[], int&);
  void ListAllUsers(const User[], int&);
  void Prefix(User, int);
  void ChangePhone(User[], int&);
  void Help();
  void DeleteUser(User[], int&);
  bool Search(string x) 
{
return (phone.find(x) != string::npos);
}
};

user.cpp

#include "User.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#pragma warning(disable:4996)
using namespace std;

const string PHONEBOOK_FILENAME = "phonebook.txt";

void User::Help()
{cout<<"\nWELCOME TO THE APPLICATION!\n";
 cout<<"Press 0 to display on the screen all records that are saved in the file(phonebook.txt)\n";
 cout<<"Press 1 to add 1 or more new record(s) in file(phonebook.txt)\n";
 cout<<"Press 2 to delete permanently a record from file(phonebook.txt)\n";
 cout<<"Press 3 to sort users from file(phonebook.txt) by name and display them on the screen\n";
 cout<<"Press 4 to edit a user phone number and save it after in file(phonebook.txt)\n";
 cout<<"Press 5 for help\n";
 cout<<"Press 6 to exit the application\n";
}

void User::ReadAllUsers(User people[], int &num_people)

{
    ifstream f;

    f.open(PHONEBOOK_FILENAME.c_str());

    if (f.fail())
{
  cout << "Unable to open file " << endl;
  return ;
}
    int i = 0;

    while (!f.eof() && i < 100)

    {   getline(f, people[i].firstname);
        getline(f, people[i].lastname);
        getline(f, people[i].phone);
        getline(f, people[i].country);
        getline(f, people[i].city);
        getline(f, people[i].street);
        i++;
    }
num_people = i;

f.close();

}

//Add country prefix to the phone number
void User::Prefix(User person, int num_people)
{string filecountry;
ifstream f;
    f.open("prefix.txt");
    {
    while (getline(f, filecountry))
  {
      if (person.country == filecountry )
      {
         f.ignore();//next line
         f >> person.prefix;
        }
    }
f.close();
  }
}
void User::SaveUser(User person, int &num_people)
{
ofstream f(PHONEBOOK_FILENAME.c_str(), ios::app ) ;
    if (f.fail())
    cout << "Unable to open file " << endl;
        else
        f << person.firstname << " " <<  person.lastname << " " << person.country <<  " " << person.city << " " << person.street << " " << person.prefix << "-" << person.phone << endl;
cout << "\nThe user was added\n";
}
//Save data after a modification or after a user delete
void User::SaveToFile(const User people[], int num_people)

{ofstream f;
f.open(PHONEBOOK_FILENAME.c_str());

 for(int i = 0; i < num_people; i++)

    {

        f << people[i].firstname << " " << people[i].lastname << " " <<  people[i].country << " " << people[i].city << " " << people[i].street << " " << people[i].prefix << " " << people[i].phone << endl;
}
}
// Read user data from the keyboard, add a new contact to the array
void User::AddName(User people[],int &num_people)
{User person; 
    cout <<"Enter the user's first name: ";
    cin >> person.firstname;

    cout <<"Enter the user's last name: ";
    cin >> person.lastname;

    cout <<"Enter the user's country: ";
    cin >> person.country;

    cout <<"Enter the user's city: ";
    cin >> person.city;

    cout <<"Enter the user's street: ";
    cin >> person.street;

    cout <<"Enter the user's phone number: ";
    cin >> person.phone;

    Prefix(person, num_people);

    cout <<"The prefix is " << person.prefix;

        for(int i = 0; i < num_people; i++)

    {

        if( i + 1  == num_people)

            people[num_people] = person;

    }
SaveUser(person, num_people);

   num_people++;

}
// Ask the for person's name to change, find the person in the array and
// change it to the new phone number.  Then save the new data to file by
// calling SaveToFile.
void User::ChangePhone(User people[], int &num_people)
{
User person;
int count;

cout <<"Enter name to change: ";
cin >> person.firstname;

for(count = 0; count < num_people; count++)

    {

        if(people[count].Search(person.firstname))

        {   cout <<endl<< people[count].firstname<<endl;

cout <<"Current number"<<people[count].phone;
cout << "\nNew number: ";

cin >> people[count].phone;

SaveToFile(people,num_people);
cout <<"\n\nNew number Saved.";
return;
 }
}
if(count = num_people)

        cout <<"\nName not found.\n";

}

void User::DeleteUser(User people[], int &num_people)
{string phone;
int count = 0;
ifstream f;
f.open("phonebook.txt");
cout << "Input the phone of user that you want to delete ";
cin >> phone;

for(count = 0; count < num_people; count++)

    {

        if(people[count].Search(phone))

        {   cout <<endl<< people[count].phone<<endl;
people[count].firstname = people[count].lastname = people[count].phone = people[count].country = people[count].city = people[count].street = " ";
        }
SaveToFile(people,num_people);
cout <<"\n\nUser deleted.";
return;}
f.close();
}

函数Prefix()(此功能是自动添加电话号码的国家/地区前缀,这是从文件中读取的)正在运行,但是person.prefix的值不是SaveUser()所采用的,因此该值不是写到文件中。功能SaveToFile()将所有用户保存在文件的一行中。 并且功能ChangePhone()和DeleteUser不起作用。

1 个答案:

答案 0 :(得分:1)

问题在于void User::Prefix(User person, int num_people)person的值为,因此它会复制一个人,更改该副本,然后在函数结束时该副本消失。原始文件从未更改。

您要:

void User::Prefix(User & person, int num_people)

要对指定的人有引用,这将受到您在函数内部所做的更改的影响。

此外,我建议您将保存用户更改为:

void User::SaveUser(User const & person, int &num_people) const

只是为了避免制作User对象的多余副本,但是我认为这并不是您当前拥有它的方式不正确。