【问题标题】:C++ Error with getline. How do avoid this error? "no instance of overloaded function "getline"使用 getline 的 C++ 错误。如何避免这个错误? “没有重载函数“getline”的实例
【发布时间】: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”。如果用户名不匹配,该函数会递归调用自身,这意味着它将尝试再次打开同一个文件。通过递归调用处理错误输入通常不是一个好主意。而是写一个循环。
  • 您确实因引用错误消息而获得了荣誉,但我怀疑您的引用不完整。通常,此类错误消息将另外指定在参数列表中看到的类型,通常后跟候选重载列表。这是为了让您以更少的猜测来查看哪个参数是错误的类型。

标签: c++ getline


【解决方案1】:

getline 函数需要一个 istream 和一个字符串,实际上您正在使用 ofstream 打开文件,但是这样您就无法从文件中读取任何内容,因为它仅作为输出打开。

你可以在这个 if 中使用 ifstream

if (username0 == username1) {
    ifstream read_myfile ("Data.txt");

    if (read_myfile.is_open) {
        while (getline(read_myfile, user)) {
            if (username0 == user) {
                cout << "Username is taken. Please try again.";
                RegisterUsername();
            }
        }
    }

    read_myfile.close();

    myfile.open("Data.txt");

    myfile << username0 << "\n";
}

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多