2012-04-30 14 views
-1

学校のプロジェクトに問題があります。私はUNIXの学校のサーバー上でVIMを使って書いています。プロジェクトにレコードを挿入すると、姓がスキップされます。姓が入力を受け取るのを待たずに、姓と名が同時に入力されます。以下を参照してください:C++のケース切り替えメニューを修正するにはどうすればよいですか?

私のメニューはこれをやっている:

MENU
(I)nsert new record
(L)ast name search
(S)ave database to a file
(R)ead database from a file
(Q)uit

Enter choice: i

Insert new record selected

Please enter employee's Last Name: Please enter employee's First Name:

それは先に姓のスキップされました!

cout.flush()をどこかに追加する必要がありますか?私は右の最後の名前のセクションの下にcout.flush()を追加すると、私はこのエラーを取得:

unixapps1:Lab1> make g++ -o LSL lab1.cpp Employee.cpp lab1.cpp: In function âEmployee createRecord()â: lab1.cpp:41: error: âstruct std::istreamâ has no member named âflushâ

私の中に私のメニューコードはこれです:

160 int main() {
161
162 cout << "\n"
163 << "*********************************\n"
164 << "Remember: Search for TODO's in VI before submitting project!\n"
165 << "
*********************************\n\n";
166
167 char menu_choice;
168 string fileName;
169
170 // Create a database
171 LinkedSortedList database;
172
173 while (true) {
174 // Display menu
175 cout << "MENU\n"
176 << "(I)nsert new record\n"
177 << "(L)ast name search\n"
178 << "(S)ave database to a file\n"
179 << "(R)ead database from a file\n"
180 << "(Q)uit\n\n";
181
182 cout << "Enter choice: ";
183 cin >> menu_choice;
184 cout << endl;
185
186 switch (toupper(menu_choice)) {
187
188 case 'I':
189 cout << "Insert new record selected\n\n";
190 {database.insert(createRecord());}
191 break;
192
193 case 'L':
194 cout << "Last name search selected\n\n";
195 // TODO call function to search by last name
196 // TODO call search for Last Name
197 // TODO Print all matches found
198 {string searchVal = "";
199 database.find(searchVal);}
200 break;
201
202 case 'S':
203 cout << "Save database to a file selected\n\n";
204 // TODO call function to save database to file
205 // File I/O Save to file
206 cout << "Please enter a file name: " << endl;
207 cin >> fileName;
208 {char* file = (char*) fileName.c_str();
209 writeFile(file, database);}
210 break;
211
212 case 'R':
213 cout << "Read database from a file selected\n\n";
214 // TODO call function to read database from file
215 // File I/O Read file
216 cout << "Please enter a file name: " << endl;
217 cin >> fileName;
218 {char* file = (char*) fileName.c_str();
219 readFile(file, database);}
220 break;
221
222 case 'Q':
223 exit(EXIT_SUCCESS);
224
225 // default case:
226 default:
227 cout << "Invalid choice!\n\n"
228 << "##### Please try again #####\n\n";
229 break;
230
231 cin >> menu_choice;
232 }
233 }
234 return 0;
235 }
236

マイcreateRecord()関数はこれです:

29 // Create the record to be inserted into the employee database
30 Employee createRecord() {
31 // Temporary variables for getting input from user
32 string stringInput = "";
33 int intInput = 0;
34
35 Employee newEmployee;
36
37 cout << "Please enter employee's Last Name: " << endl;
38 getline(cin, stringInput);
39 newEmployee.setLastName(stringInput);
40
41 cout << "Please enter employee's First Name: " << endl;
42 getline(cin, stringInput);
43 newEmployee.setFirstName(stringInput);
44
45 cout << "Please enter employee's ID: ";
46 getline(cin, stringInput);
47 stringstream myStream(stringInput);
48 myStream >> intInput;
49 newEmployee.setId(intInput);
50
51 cout << "Please enter employee's Salary: ";
52 getline(cin, stringInput);
53 myStream >> intInput;
54 newEmployee.setSalary(intInput);
55
56 cout << "Please enter employee's Department: ";
57 getline(cin, stringInput);
58 newEmployee.setDepartment(stringInput);
59
60 cout << "Please enter employee's Phone Number: ";
61 getline(cin, stringInput);
62 newEmployee.setPhoneNumber(stringInput);
63
64 cout << "Please enter employee's Address: ";
65 getline(cin, stringInput);
66 newEmployee.setAddress(stringInput);
67
68 cout << "Please enter employee's Hire Date: ";
69 getline(cin, stringInput);
70 newEmployee.setHireDate(stringInput);

答えて

4

入力ストリームにまだ改行またはその一部があるように見えます。

std::istream::ignore()を使用して、入力ストリームの残りの文字を食べてみてください。

+0

改行の一部ですか? :+1 –

+1

具体的には、 'cin.ignore(std :: numeric_limits :: max()、 '\ n');' –

+1

@SethCarnegie:はい、改行を2文字にすることを人々に思い出させるために、キャリッジリターン '\ r'と改行。プラットフォームまたはオペレーティングシステムによって異なります。 :-) –

1

cout.flush()の代わりにcin.get()を試しましたか?

関連する問題