Невозможно получить входные данные из файла, содержащего строковые переменные - PullRequest
0 голосов
/ 16 апреля 2011

Я решил сделать телефонную книгу на c ++ и решил взять из файла имена, адреса и номера. Поэтому я создал класс с именем contact и объявил открытые переменные name, address и number. Используя конструктор, я инициализировал их для name = "noname" (строка), number = 0 (int), address = "no address" (строка) Теперь мое тело main выглядит так:

int main(){

contact *d;

d= new contact[200];

string name,add;

int choice,modchoice;//Variable for switch statement

int phno,phno1;

int i=0;
int initsize=0, i1=0;//i is declared as a static int variable

bool flag=false,flag_no_blank=false;


//TAKE DATA FROM FILES.....
//We create 3 files names, phone numbers, Address and then abstract the data from these files first!

fstream f1;
fstream f2;
fstream f3;

string file_input_name; 
string file_input_address;

int file_input_number;


f1.open("./names");

while(f1>>file_input_name){

  d[i].name=file_input_name;

  i++;

}
initsize=i;


f2.open("./numbers");

while(f2>>file_input_name){

  d[i1].phonenumber=file_input_number;
  i1++;

}


f3.open("./address");

while(f3>>file_input_address){

  d[i1].address=file_input_address;

  i1++;

}

теперь, когда я позже ищу конкретную запись по имени, имя отображается правильно, но номер телефона возвращается в качестве значения мусора, а адрес - в качестве "Noaddress" Я не понимаю, почему это происходит ... Если вы хотите посмотреть весь код, дайте мне знать ....

Вот как я ищу конкретную запись, которая возвращает имя, если найдено, но возвращает мусор для номера телефона ....

cout<<"\nEnter the name";//Here it is assumed that no two contacts can have same contact number or address but may have the same name.
cin>>name;

int k=0,val;
cout<<"\n\nSearching.........\n\n";

for(int j=0;j<=i;j++){
  if(d[j].name==name){
    k++;            
    cout<<k
        <<".\t"
        <<d[j].name
        <<"\t"<<d[j].phonenumber
        <<"\t"<<d[j].address
        <<"\n\n";
    val=j;                  
  }
}

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 16 апреля 2011

Когда вы читаете файл с телефонными номерами

f2.open("./numbers");

while(f2>>file_input_name){

d[i1].phonenumber=file_input_number;
i1++;

}

Вы сохраняете номер телефона в строке file_input_name, но затем используете другую переменную, file_input_number для хранения информации в массивед;

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

Поскольку вы используете C ++, а не C, вам следует воспользоваться преимуществами, которые поставляются с языком.Не используйте массивы для хранения ваших данных, используйте std::vector.Таким образом, вам не нужно запоминать, сколько вещей вы уже вложили в вектор, потому что вы всегда можете попросить вектор сообщить вам size().

Если бы мне пришлось читать в трех файлахЯ бы пошел так:

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <algorithm>

using std::cin;
using std::cout;
using std::fstream;
using std::string;
using std::vector;

class contact {
public:
  string name;
  string address;
  int phone;
};

void print_contact(const contact &c) {
  cout << "name " << c.name << " address " << c.address << " phone " << c.phone << "\n";
}

int main(int argc, char **argv)
{
  vector<contact> contacts;

  string name;
  string address;
  int phone;

  fstream f1("d:\\names.txt");
  fstream f2("d:\\phones.txt");
  fstream f3("d:\\addresses.txt");

  // note that I am using getline() here.
  while (getline(f1, name) && f2 >> phone && getline(f3, address)) {
    contact c;
    c.name = name;
    c.address = address;
    c.phone = phone;
    contacts.push_back(c);
  }

  for_each(contacts.begin(), contacts.end(), print_contact);

  // for the Windows console window
  cout << "Press return to continue ...";
  string s;
  getline(cin, s);
  return 0;
}
0 голосов
/ 16 апреля 2011

Эй, ребята, я понял проблему .... проблема в том, что i1 должен быть установлен в 0 после второго цикла и что файл, содержащий входные числа, должен быть f2.open ("числа"), а не имена .... глупая ошибка !!

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