2015-11-19 6 views
1

Я работаю над другим школьным проектом, частью которого я должен взять данные из TXT-файла и преобразовать его в вектор смешанного типа ..., который содержит два целые числа и строку. Я пробовал различные способы сделать это, и у меня это до того, куда вводится файл .txt и, надеюсь, отправляется в векторы. Моя трудность возникает, когда я пытаюсь делать вещи с помощью векторов. Мой сегмент кода выглядит следующим образом (я объясню, что вещи для с комментариями):C++ Создание вектора из данных файла .txt

bool ReadPeopleFromFile(int argc, char* argv[], vector<Person> &people) { 
    Person tmpPrsn; 
    int tmpAge; 
    string tmpGender; 
    int tmpAnualIncome; 
    ifstream PeopleFile("dev_people.txt"); // Try to open file 
    if (!PeopleFile.is_open()) { 
     cout << "Could not open file.\n"; 
     return true; // indicates error 
    } 

    cout << "Starting" << endl; 
    while (!PeopleFile.eof()) { 
     PeopleFile >> tmpAge; 
     PeopleFile >> tmpGender; 
     PeopleFile >> tmpAnualIncome; 
     tmpPrsn.SetData(tmpAge, tmpGender, tmpAnualIncome); 
     tmpPrsn.Print(); 
     people.push_back(tmpPrsn);                 // Need to look at this!!! 
    } 
    PeopleFile.close(); 
    cout << "Finished reading file." << endl; 
    return false; 
} 
//I have a function that gets the user input... I took it out for this post.  
vector<Person> ptntlCstmrs; 

// Return people within the given age range. 
vector<Person> GetPeopleWithQualifyingCharacteristics(vector<Person> ppl, int AgelowerRange, int AgeupperRange, string DesiredGender, int YIlowerRange, int YIupperRange) { 
    unsigned int i = 0; 
    unsigned int j = 0; 
    unsigned int k = 0; 

    vector<Person> pplInRange; 
    int age = 0; 
    string gender = ""; 
    int yearlyIncome = 0; 
    for (i = 0; i < ppl.size(); ++i) { 
     for (j = 0; j < ppl.size(); ++j) { 
      for (k = 0; k < ppl.size(); ++k) { 
       age = ppl.at(i).GetAge(); 
       gender = ppl.at(j).GetGender(); 
       yearlyIncome = ppl.at(k).GetYearlyIncome(); 
       if ((age >= AgelowerRange) && (age <= AgeupperRange) && (gender == DesiredGender || gender == "Any") && (yearlyIncome >= YIlowerRange) && (yearlyIncome <= YIupperRange)) { 
        ptntlCstmrs.push_back(ppl.at(i)); 
       } 
      } 
     } // I know this section is messed up... I can't figure out how to get this part to work. What I'm trying to do is take the input, and filter it based on the user-inputted criteria. Nothing that I have done has worked. 
    } 
    return pplInRange; 
} 
int main(int argc, char* argv[]) { 
    vector<Person> ptntlCstmrs; 
    bool hadError = false; 
    int ageLowerRange = 0; 
    int ageUpperRange = 0; 
    string desiredGender = ""; 
    int yearlyIncomeLowerRange = 0; 
    int yearlyIncomeUpperRange = 0; 

    hadError = ReadPeopleFromFile(argc, argv, ptntlCstmrs); 
    if (hadError) { 
     return 1; // indicates error 
    } 
    GetUserInput(ageLowerRange, ageUpperRange, desiredGender, yearlyIncomeLowerRange, yearlyIncomeUpperRange); 
    ptntlCstmrs = GetPeopleWithQualifyingCharacteristics(ptntlCstmrs, ageLowerRange, ageUpperRange, desiredGender, yearlyIncomeLowerRange, yearlyIncomeUpperRange); 
    cout << "\nNumber of potential customers = " << ptntlCstmrs.size() << endl; 


} 

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

+0

Возможно, не ваша проблема, но вы должны прочитать следующее: http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong –

+2

Я не понимаю, как вы используете трех- вложенные циклы, чтобы получить критерии. Вы получаете информацию о человеке 'i', person' j' и person 'k'. Разве вы не должны получать критерии «i» и видеть, соответствует ли он критериям? Другими словами, один цикл на 'i'? – PaulMcKenzie

+0

@PaulMcKenzie Это может быть ... Я пытался структурировать его таким образом, но он терпел неудачу каждый раз. Можете ли вы показать мне, как это будет правильно структурировано? – Danny

ответ

0

Мои первоначальные мысли состоят в том, что вы не правильно собираете данные пользователя. Вы отправляете переменные, которые определяют, является ли объект Person потенциальным клиентом в другой функции.

По умолчанию C++ передает параметры по значение - это означает, что когда параметр передается в функцию, копия указанного параметра создается и используется во всей этой функции. Когда функция подходит к завершению, отредактированный параметр затем удаляется, и все изменения/изменения теряются. Если вы хотите захватить пользовательский ввод из другого метода и сохранили указанный вход, обязательно передайте свои параметры по адресу с ссылкой.

Передача по ссылке, по существу, указывает машине, где этот конкретный параметр находится в памяти, и позволяет программе напрямую обращаться к этой части памяти, а не копировать параметр при выполнении вашей функции. Это, в свою очередь, вносит изменения в параметры постоянно!

Надеюсь, это поможет!

+0

Все, что вам нужно сделать, чтобы передать по ссылке, в заголовке функции помещает '&' перед всеми вашими именами параметров. В качестве примера: void foo(int &num1, int &num2, int &num3){ ...} Поместив '&' перед именами параметров, вы означаете, что вы передаете этот параметр по ссылке. Не забудьте обновить прототипы функций! – Pacopenguin

1

Кредит действительно относится к @PaulMcKenzie. Проблема с указанным кодом находится в следующем разделе:

Return people within the given age range. 
vector<Person> GetPeopleWithQualifyingCharacteristics(vector<Person> ppl, int AgelowerRange, int AgeupperRange, string DesiredGender, int YIlowerRange, int YIupperRange) { 
unsigned int i = 0; 
unsigned int j = 0; 
unsigned int k = 0; 

vector<Person> pplInRange; 
int age = 0; 
string gender = ""; 
int yearlyIncome = 0; 
for (i = 0; i < ppl.size(); ++i) { 
    for (j = 0; j < ppl.size(); ++j) { 
     for (k = 0; k < ppl.size(); ++k) { 
      age = ppl.at(i).GetAge(); 
      gender = ppl.at(j).GetGender(); 
      yearlyIncome = ppl.at(k).GetYearlyIncome(); 
      if ((age >= AgelowerRange) && (age <= AgeupperRange) && (gender == DesiredGender || gender == "Any") && (yearlyIncome >= YIlowerRange) && (yearlyIncome <= YIupperRange)) { 
       ptntlCstmrs.push_back(ppl.at(i)); 
      } 
     } 
    } // I know this section is messed up... I can't figure out how to get this part to work. What I'm trying to do is take the input, and filter it based on the user-inputted criteria. Nothing that I have done has worked. 
} 
return pplInRange; 

, который необходимо изменить следующим образом:

vector<Person> GetPeopleWithQualifyingCharacteristics(vector<Person> ppl, int Agelow, int Ageup, string DesGen, int YIlow, int YIup) { 
    unsigned int i = 0; 
    int age = 0; 
    string gender = ""; 
    int yearlyIncome = 0; 
    ifstream PeopleFile("dev_people.txt"); 
    while (PeopleFile >> age >> gender >> yearlyIncome); 
    vector<Person> pplInRange; 

    for (i = 0; i < ppl.size(); ++i) { 
     age = ppl.at(i).GetAge(); 
     gender = ppl.at(i).GetGender(); 
     yearlyIncome = ppl.at(i).GetYearlyIncome(); 
     if ((age >= Agelow) && (age <= Ageup) && (DesGen == gender || DesGen == "Any") && (yearlyIncome >= YIlow) && (yearlyIncome <= YIup)) { 
      pplInRange.push_back(ppl.at(i)); 
     } 
    } 

    return pplInRange; 
} 

Сейчас он работает отлично. Спасибо, Пол!

Смежные вопросы