【发布时间】:2019-08-17 17:47:59
【问题描述】:
我正在尝试制作一个包含用户名和密码的文本文件。我想通过将输入字符串与文本文件中的每一行进行比较来检查用户名是否已被使用。我正在使用 getline,但我收到此错误消息“没有重载函数的实例”getline“与参数列表匹配”。
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
void RegisterUsername() {
string username0;
string username1;
string user;
ofstream myfile;
myfile.open("Data.txt", ios::app);
cout << "Please enter your username:\n";
cin >> username0;
cout << "Please reenter your username:\n";
cin >> username1;
if (username0 == username1) {
myfile.open("Data.txt");
if (myfile.is_open) {
while (getline(myfile, user)) {
if (username0 == user) {
cout << "Username is taken. Please try again.";
RegisterUsername();
}
}
}
myfile << username0 << "\n";
}
else {
cout << "Usernames did not match. Please try again.\n";
RegisterUsername();
};
myfile.close();
};
int main()
{
RegisterUsername();
RegisterPassword();
cin.get();
};
【问题讨论】:
-
if (myfile.is_open)应该是if (myfile.is_open()) -
并将
ofstream更改为ifstream,您无法从输出流中读取数据。 -
这并没有解决问题,而是养成使用有意义的值初始化对象的习惯,而不是默认构造它们并立即覆盖默认值。即,将
ofstream my file; myfile.open("Data.txt", ios::app);更改为ofstream my file("Data.txt", ios::app);。另外,在此处打开文件然后在循环内再次打开它有点奇怪。只需在您需要的地方创建它。最后,您无需致电myfile.close();。析构函数会这样做。 -
这段代码还有一个问题。每次调用该函数时,它都会打开文件“Data.txt”。如果用户名不匹配,该函数会递归调用自身,这意味着它将尝试再次打开同一个文件。通过递归调用处理错误输入通常不是一个好主意。而是写一个循环。
-
您确实因引用错误消息而获得了荣誉,但我怀疑您的引用不完整。通常,此类错误消息将另外指定在参数列表中看到的类型,通常后跟候选重载列表。这是为了让您以更少的猜测来查看哪个参数是错误的类型。