这是一个仅允许授权股东参加会议的程序,该程序以文件输入的形式给出。
它会在终端上询问名称并检查它是否在文件中。如果不是,它会再次要求以正确的格式输入名称。如果第二次问题仍然存在,则说明该人未获得授权。
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;
int main(){
ifstream name_sh;
name_sh.open("shareholders.dat");
string keep_sh[1000];
char varkeep[32];
name_sh.get(varkeep, 32);
int counter = 0;
while(name_sh){
name_sh.ignore(100, '\n');
keep_sh[counter] = varkeep;
counter++;
name_sh.get(varkeep, 32);
}
while(true){
cout << "Please tell your name or press Q to exit ";
char input[32];
cin.get(input, 32);
if(input[0]=='Q' && input[1]=='\0') break;
for(int j = 1; j <= 2; j++){
int i;
for(i=0; i < counter; i++){
// char str[32] = keep_sh[i];
if(input == keep_sh[i]){
cout << "You are welcome." << endl;
break;
}
}
if(i < counter) break;
else if(j == 1){cout << "Write the official name in the formal way ";cin.get(input, 32);}
else cout << "Sorry, but you are not allowed." << endl;
}
cout << "Next." << endl;
//break;
/*string cc = keep_sh[0];
char cv[32];
cin.get(cv, 32);
cout << (cv == cc);*/
//for(int i=0; i<counter; i++) cout << keep_sh[i] << endl;
//cout << counter;
}
如果我取消注释最后一个
break
语句,循环将停止,同时检查输入是否在 keep_sh
文件中。但注释它会使代码无限循环运行。
我无法理解的是为什么终端不停止接受下一个输入,该输入正好位于 while 循环“line”之后的第五行?
底部注释的代码行表明我已经检查文件输入流工作正常。它正在打印所需的输出。
输入文件包含:
Harry Wellington
Charls Rasso
Tim Pots
Charlie Hammer
Nicolas Jorden
Peter Hann
Tobe Ludwig
Charlie Robert
每个都占单独的一行。
Enter
时,
std::istream::get()
不会提取终止的 \n
。您将每个 \n
留在缓冲区中以供后续读取提取,因此您的 input
值将有一个领先的 \n
,这会导致您无法进行比较。而当您从文件中读取行时,您正在ignore()
'ing \n
。
在此代码中没有充分的理由使用
char[]
数组。 文件输入和用户输入都是基于行的,并且行的长度是可变的,因此您应该将 std::string
与 std::getline()
一起使用,而不是使用 chr[]
与 std::istream::get()
一起使用。
尝试更多类似这样的事情:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<string> keep_sh;
string varkeep, input;
ifstream name_sh("shareholders.dat");
while (getline(name_sh, varkeep) {
keep_sh.push_back(varkeep);
}
name_sh.close();
do {
cout << "Please tell your name or press Q to exit: ";
if (!getline(cin, input)) break;
if (input == "Q") break;
for (int j = 1; j <= 2; ++j) {
if (find(keep_sh.begin(), keep_sh.end(), input) != keep_sh.end()) {
cout << "You are welcome." << endl;
break;
}
if (j == 1) {
cout << "Write the official name in the formal way: ";
getline(cin, input);
continue;
}
cout << "Sorry, but you are not allowed." << endl;
}
cout << "Next." << endl;
}
while (true);
}