没有用于调用GetLine()的匹配函数

时间:2017-05-17 01:02:31

标签: c++ ifstream getline istream

我试图在C ++中创建一个函数,它从文件中读取所有行,然后将所有行连接成一个字符串,然后返回该字符串。以下是我用来完成此任务的代码:

// at the top of the file

#include "string_helper.hpp" // contains definition for function
#include <vector>
#include <string.h> // used in another function within the same file
#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;

// the code I believe to be problematic

ifstream input("file.txt");
string result(0);
string line;

while (std::getline(&input,&line)) {
    result += line;
}

但是,当我尝试编译此代码时,收到此错误:

<project root>/src/string_helper.cpp:52:35: error: no matching function for call to ‘getline(std::ifstream (*)(std::__cxx11::string), std::__cxx11::string*)’
   while (std::getline(&input,&line)) {
                                   ^
In file included from /usr/include/c++/6.3.1/string:53:0,
                 from include/string_helper.hpp:22,
                 from <project root>/src/string_helper.cpp:19:

我查看了www.cplusplus.com,它将getline的定义列为:

istream& getline (istream& is, string& str);

我很困惑,因为我正在使用&amp; while循环声明中的符号,但编译器仍然说我使用了不正确的参数。

编辑:事实证明我不小心创建了一个功能。 input的真实声明是:

ifstream input(string(filename));

因为我必须从filename解析char *。我没有将其包含在原始代码中,因为我试图使其成为通用的,因此它适用于许多人。我对C ++比较陌生。只需在input声明之外创建字符串即可解决问题。所以我做了:

string fname(filename);
ifstream input(fname);

对不起。

4 个答案:

答案 0 :(得分:2)

GetLine的参数是参考。在C ++中,您不需要显式地为函数提供引用。编译器会为你做这件事。

因此,您的函数调用:

std::getline(&input,&line)

将成为:

std::getline(input, line)

答案 1 :(得分:1)

您正在传递变量的地址。初学者&有点混乱,意味着在变量类型的上下文中引用,但意味着在使用变量的上下文中的地址。

对于那个工作getline的调用需要接受指针参数,它没有,因此在给定参数的情况下没有匹配的函数调用。

您不必做任何特别的事情来传递参考。传递给函数的引用和值之间的区别是由函数而不是调用者进行的。

所以只需删除那些&符号就可以了。

#include <fstream>
#include <iostream>

using namespace std;

int main()
{
    ifstream input("file.txt");
    string result;
    string line;

    while (getline(input, line)) 
    {
        result += line;
    }

    cout << result << '\n';
}

您也不需要初始化result字符串。默认情况下,它初始化为空字符串。

答案 2 :(得分:0)

尝试确保您的std::getline(...)使用正确类型的变量作为参数。

    • std::basic_istream<CharT,Traits>& input
    • std::basic_string<CharT,Traits,Allocator>& str
    • CharT delim
    • std::basic_istream<CharT,Traits>&& input
    • std::basic_string<CharT,Traits,Allocator>& str
    • CharT delim
    • std::basic_istream<CharT,Traits>& input
    • std::basic_string<CharT,Traits,Allocator>& str
    • std::basic_istream<CharT,Traits>& input
    • std::basic_string<CharT,Traits,Allocator>& str
    • CharT delim
  1. 您应该只能将参数从引用的地址(&)更改为实际值(无&)。当函数请求&value时,您可以直接将值传递给它,通常是。

    http://en.cppreference.com/w/cpp/string/basic_string/getline

    #include <string>
    #include <fstream>
    
    int main()
    {
        std::ifstream input("C:\\temp\\file.txt");
        std::string result;
        std::string line;
    
        while (std::getline(input, line)) {
            result += line;
        }
        printf("Made it!\n");
        return 0;
    }
    

答案 3 :(得分:0)

把这段代码。它会临时工作,你可以使它通用。

//#include "string_helper.hpp" // contains definition for function
#include <vector>
#include <string.h> // used in another function within the same file
#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;
int main()
{
    ifstream input("file.txt");
    string result;
    char line[100];


    while (input.getline(line,'\n')) 
    {
        result += line;
    }
    cout<<"string = "<<result<<endl;
}