2009-12-10 3 views
0

개인, 이름, ID #, 주소 및 전화 번호에 대한 여러 클래스를 만드는 것이 내 과제입니다.C++ 텍스트 메뉴 : 데이터 쓰기, 읽기 및 정렬

이름 구성 : 이름, 성, 이름. ID 번호 : 9 자리. 주소는 다음을 구성합니다 : 거리, 도시, 주 및 5 자리 우편 번호. 전화 번호는 3 자리 숫자와 7 자리 숫자로 구성됩니다. 전체 이름 (이름, 중간, 성), 주소, 전화 번호 (지역 번호 및 번호) 및 ID 번호 (9 자리 번호)로 구성됩니다.

나는이 모든 것을 성취했다. 내 문제는 우리가 메뉴를 만들고, 사용자가 입력하고자하는 사람의 수, 파일을 저장하려는 사람, 사용자가 지정한 파일을 읽거나 쓸 수 있는지, 그리고 가능한지 지정하는 것이다. (마지막, 처음 또는 중간) 또는 ID #별로 사람들을 정렬하고 정렬 된 목록을 사용자가 지정한 파일에 저장합니다.

필자는 모든 코드를 작성했지만 작성 기능이 작동하지 않습니다. 어떻게됩니까? 제가 만든 프로그램을 실행하면 팝업 메뉴가 나타납니다. '1'을 선택하여 파일을 입력 한 다음 메뉴가 다시 팝업되고 '2'를 선택하여 테스트중인 특정 파일에 아무것도 없으므로 '2'를 선택하여 읽을 수 없습니다. 다음으로 사용자 지정 파일에 People을 쓰려면 '3'을 선택합니다. 얼마나 많은 사람들이 들어가길 원하는지 물어보고 숫자를 입력합니다 (2).

//global variables 
char filename[256]; 
fstream file2 (filename); 

int r; 
Person * stuArrPtr=new Person[r]; 

int w; 
Person * stuArrPtr2=new Person[w]; 

//global functions 
void WriteUserFile() { 
//write as many ppl as specified to a file... 
// int w; 
cout << "How many students would you like to enter?: "; 
cin >> w; 

// Person * stuArrPtr2=new Person[w]; 
if (!file2.is_open()) { 
    cout << "File did not open" << endl; 
    file2.clear(); 
    file2.open (filename, ios_base::out); 
    file2.close(); 
    file2.open (filename, ios_base::out | ios_base::in); 

} 
else { 
    for (int i = 0; i < w/*!file2.eof()*/; i++) { 
    stuArrPtr2[i].InputPerson(); 
    if (strcmp(stuArrPtr2[i].PersonNam.GetFirst(), "EOF") != 0) 
    stuArrPtr2[i].Display (file2); 
    } 
} 
cout << endl; 
// delete [] stuArrPtr2; 
} 

void Menu() { 
int option; 
do { 
    //display menu 
    cout << " Type '1' - to open a file for reading or writing" << endl << endl; 
    cout << " Type '2' - to read from the file you specified in '1'" << endl << endl; 
    cout << " Type '3' - to write from the file you specified in '1'" << endl << endl; 
    cout << " Type '4' - sort students by last name" << endl << endl; 
    cout << " Type '5' - sort students by first name" << endl << endl; 
    cout << " Type '6' - sort students by middle name" << endl << endl; 
    cout << " Type '7' - sort students by ID number" << endl << endl; 
    cout << " Type '8' - exit" << endl << endl; 
// cout << " Enter appropriate number here: [ ]\b\b"; 
    cout << " Enter appropriate number here: "; 
    cin >> option; 

    switch(option) { 
    case 1: 
    cout << "you entered option 1" << endl; 
    OpenUserFile(); 
    break; 
    case 2: 
    cout << "you entered option 2" << endl; 
    ReadUserFile(); 
    break; 
    case 3: 
    cout << "you entered option 3" << endl; 
    WriteUserFile(); 
    break; 
    case 4: 
    cout << "you entered option 4" << endl; 
    SortLastName(); 
    break; 
    case 5: 
    cout << "you entered option 5" << endl; 
    SortFirstName(); 
    break; 
    case 6: 
    cout << "you entered option 6" << endl; 
    SortMiddleName(); 
    break; 
    case 7: 
    cout << "you entered option 7" << endl; 
    SortIDNumber(); 
    break; 
    case 8: 
    cout << "you entered option 8" << endl; //exit 
    delete [] stuArrPtr; 
    delete [] stuArrPtr2; 
    break; 
    default: 
    cout << "you screwed up, no big deal, just try again!" << endl; 
    } //end switch 
    //if (option == 6) { 
    // break; 
    //} 
} while (option != 8); 
// system("pause"); 
} 

void main() { 
Menu(); 
} 
/////////////////END OF CODE/////// 

죄송합니다 : 여기에

내 코드입니다 ... 첫 번째 이름을 입력에 대한 프롬프트가 뜨고 내 프로젝트 .exe로 "처리되지 않은 win32에서 예외가 발생했습니다"라는 몇 가지 오류 코드가 너무 길어서 어떤 도움을 주셔서 감사합니다!

+0

코드를 재구성 할 수 있습니까? 4 칸만큼 들여 씁니다. – Lucas

+0

적어도 코드 부분이 1 블록이라는 코드를 다시 포맷 해 주실 수 있습니까? 감사합니다 – fritzone

+1

다음은 코드를 편집하는 방법입니다. http://stackoverflow.com/editing-help – Lucas

답변

1

코드의 문제는 처음 몇 줄입니다.

프로그램 시작시 w는 대부분 0으로 초기화됩니다. 따라서 0 인물의 배열을 만듭니다. stuArrPtr2[i].InputPerson()stuArrPtr2[i]->InputPerson()으로 호출하는 순간, 존재하지 않는 개체의 멤버 함수에 액세스하려고 시도합니다.

WriteUserFile() 안에 stuArrPtr2 = new Person[w]과 같이 방금 입력 한 숫자에 따라 새 Person 객체를 만드는 것이 무엇을해야 할 것입니다.

건배 홀거

+0

Ok, sooo sooo !! 그건 고쳐졌고 당신이 지적 했으니 나에게 의미가 있습니다. 그러나 이제는 1 개의 작은 문제가 생겼습니다. WriteUserFile()을 실행할 때 학생 번호를 입력하고 첫 번째 프롬프트를 건너 뜁니다 (이름 입력). 그래서 내가 입력 할 수있는 첫 번째 프롬프트는 중간 이름입니다. 왜 그것이 첫 번째 프롬프트를 건너 뛰는 것입니까 (이름 입력)? – nick

+0

내가 InputPerson() 함수가 어떻게 생겼는지 알지 못하기 때문에 어떤 문제가 생겼는지 알기가 어렵습니다. –

+0

모든 도움을 주신 데 대해 감사드립니다.이 문제는 WriteUserFile() 전에 추가 cin.getline을 사용하여 해결했습니다. 문제가 해결되었습니다! – nick

0

무엇을 stuArrPtr2[i].Display (file2);이 (가) 사용하고 있습니까?

마지막 사람을 기억하는 더 좋은 방법이 없습니까?

if (strcmp(stuArrPtr2[i].PersonNam.GetFirst(), "EOF") != 0) 

배열 또는 연결된 목록의 항목 수와 유사합니다.

+0

stuArrPtr2 [i] .Display (file2); 사용자가 지정한 입력 파일 인 file2에 Person 데이터를 표시합니다. 그리고 마지막 사람을 어떻게 기억해야할지 모르겠습니다. – nick

+0

그래서 기본적으로 stuArrPtr2 [i] .Display (file2); 사용자 지정 입력 파일에 Person 데이터를 씁니다. – nick

0

몇 가지 힌트 :

  • 사용 표준 : : 문자열,
  • 개체가 절대적으로 필요하지 않는 한 새로운 사용하여 생성하지 않는 문자의하지 배열
  • 이 범위에 대한 자세한 내용 - 당신의 파일 스트림은 소리가 나지 않습니다.
  • 메인은 int를 반환해야합니다.
  • 코드를 작성하기 전에 생각해보십시오.
+0

글쎄, 당신은 메인에 대해 틀렸어. 선생님이 내가 위의 방식대로 해줄 거라고 말했어. 너가받는 길은 낡고 나쁜 연습으로 간주된다. 너는 너무 많은 노력없이 std :: string을 사용할 수 없다. 왜냐하면 내가 사용하고있는 많은 함수들이 "char *"를 사용하기 때문에 정말로 유일한 옵션이다 ... 나는 나의 파일 스트림의 범위가 전역 적으로는 안된다는 것을 이해하지만, 이것이 내 코드가 작동하는 유일한 방법이며, 다른 수업을 쓸 시간 ... 그리고 마지막으로 주셔서 감사합니다. 어떤 종류의 코멘트입니까? – nick

+0

선생님이 틀렸다고 생각하지 않았습니까? –

+0

아니, 내게 이런 두 번째 선생님이 있기 때문에 그것은 나에게 발생하지 않습니다. 또한 몇 달 전에 대학을 방문하여 여러 개의 C++ 클래스에 앉아서 모든 주요 기능이 위에 쓴 것처럼 작성되었습니다 ... 선생님이 틀렸다고해도 왜 컴파일되고 코드가 실행됩니까? – nick