2017-04-13 2 views
-1

Ich erstelle ein Adressbuch-Programm, mit dem Benutzer nach Vorname, Nachname, Telefonnummer und Adresse suchen können. Der Benutzer wird aufgefordert, einen Dateinamen einzugeben, und die Datei wird in ein Array eingelesen. Ich habe Probleme mit der bestehenden SearchFirstName-Funktion zu ändern, um das Array zu durchlaufen. Ich habe dieses Thema mehrmals gelesen. Ich verstehe es einfach nicht. Jede Hilfe würde sehr geschätzt werden.C++ - Arrays und Lesen von Datei

Datei

Susan, Smith, 123 456 789 
101 Main Street 
Bob, Smith, 567 345 9076 
456 Market Street 

Header-Datei

#include<string> 
using namespace std; 

enum Title {Mr, Mrs, Ms, Dr, NA}; 

struct NameType { 
Title title; 
string firstName; 
string lastName; 
}; 

struct AddressType { 
    string street; 
    string city; 
    string state; 
    string zip; 
}; 

struct PhoneType { 
    int areaCode; 
    int prefix; 
    int number; 
}; 

    struct entryType { 
    NameType name; 
    AddressType address; 
    PhoneType phone; 
}; 

const int MAX_RECORDS = 50; 

struct addressBookType { 
    entryType record[MAX_RECORDS]; 
    int numEntries; 
}; 

-Code

string bookArray[MAX_RECORDS]; 

int main() 
{ 
    entryType userRecord; 
    string filename; 
    ifstream inData; 
    char searchOption; 

    OpenFile(filename, inData); 

    MainMenu(inData, filename); 

    return 0; 
} 

void OpenFile(string& filename, ifstream& inData) 
{ 
    do { 
     cout << "Enter file name to open: "; 
     cin >> filename; 

     inData.open(filename.c_str()); 

    if (!inData) 
     cout << "File not found!" << endl; 

} while (!inData); 


    if(inData.is_open()) 
    { 

     for(int i=0; i<MAX_RECORDS;i++) 
     { 
     inData>> bookArray[i]; 
     } 
    } 
} 

// Searches passed file stream for a first name read from the user 

void SearchFirstName(ifstream& inData) 
{ 
    string searchName; 
    entryType userRecord; 
    string normalSearchName, normalFirstName; 
    char choice; 
    bool found = false; 

    cout << "Enter first name to search for: "; 
    cin >> searchName; 

    normalSearchName = NormalizeString(searchName);  // Convert name to all uppercase 

    // Loop through all records in the file 
    while (GetRecord(inData, userRecord)){ 

    normalFirstName = NormalizeString(userRecord.name.firstName); // Convert retrieved string to all uppercase 

    if (normalFirstName == normalSearchName) { // Requested name matches 
     PrintRecord(userRecord); 
     cout << "Is this the correct entry? (Y/N)"; 
     cin >> choice; 
     choice = toupper(choice); 
     cout << endl; 

     if (choice == 'Y') { 
      found = true; 
      break; 
     } 
    } 
} 

// Matching name was found before the end of the file 
if (inData && !found){ 
    cout << "Record found: " << endl; 
    PrintRecord(userRecord); 
    cout << endl; 
} 
else if (!found) // End of file. Name not found. 
{ 
    cout << searchName << " not found!" << endl << endl; 
} 

// Clear file fail state and return to beginning 
inData.clear(); 
inData.seekg(0); 
} 

Mein Versuch

void SearchFirstName(ifstream& inData) 
{ 
    string searchName; 
    entryType userRecord; 


cout << "Enter first name to search for: "; 
cin >> searchName; 

string newSearchName = NormalizeString(searchName); 
string upFirst = NormalizeString(userRecord.name.firstName); 

for (int i=0;i<MAX_RECORDS;i++) 
{ 
    while(newSearchName == upFirst) 
    { 
     if (bookArray[i]== upFirst) 
     { 
      cout<<"Name Found"; 
      cout <<bookArray[i]; //test case 
     } 
    } 


} 
} 
+0

Wo haben Sie Probleme genau? – chbchb55

+0

@ chbchb55 Ich habe meine Frage bearbeitet, um zu zeigen, was ich versucht habe. Mein Code durchläuft das Array in der SearchFirstName-Funktion nicht ordnungsgemäß. – Taylor

Antwort

0
  1. Erstellen Sie Ihr Array, in diesem Fall wird es ein std::vector, weil das einfacher zu verwenden ist, indem Sie Ihre GetRecord Funktion innerhalb einer While-Schleife ausführen und das Ergebnis an den Vektor w/vector_variable_name.push_back(NormalizeString(value_returned_from_GetRecord)); anhängen. Der NormalizeString Teil ist so, dass Sie ihn nicht Milliarden von Malen später anrufen müssen.
  2. Pass in Ihrem Array wie so void SearchFirstName(std::vector<entryType> *in_data_arr>)
  3. ändern while Schleife zu einer for Schleife: for (int i = 0; i < in_data_arr.size(); i++) {
  4. Innerhalb der Schleife Änderung von dort sollte es in der Regel identisch sein normalSearchName = NormalizeString(searchName); zu normalSearchName = in_data_arr[i].name.firstName;

Und.

+0

Gibt es eine Möglichkeit, dies ohne Verwendung von Vektoren zu tun? – Taylor

+0

Ja, Sie haben zwei Optionen: dynamisch zugewiesene Array von Zeichenfolgen mit GetRecord (Sie müssen es ein paar Mal neu zuweisen), oder einfach alles in einer Zeichenfolge speichern und dann herauszufinden, wie viele Datensätze es gibt und dann ein Array basierend auf seiner Größe erstellen und manuell laden das ganze Ding in einer for-Schleife – chbchb55

+0

Ich würde empfehlen, einen Vektor zu verwenden, es dauert nur eine und wenn Sie wirklich ein Array brauchen, ist es sehr einfach ein Array aus einem Vektor zu machen! – chbchb55