c ++代码中的getline()函数错误

时间:2015-06-12 03:05:49

标签: c++

有人可以告诉我我在这里做错了什么我得到一个错误,说getline()没有在这个范围内声明.........任何帮助将不胜感激。

没有用于调用getline的匹配函数(char **,size_t *,FILE *&)

    #include<iostream>
    #include<fstream>
    #include<string>

    using namespace std;

    char *s;

    int main(int argc, char *argv[])
    {
        FILE* fd = fopen("input.txt", "r");
        if(fd == NULL)
        {
            fputs("Unable to open input.txt\n", stderr);
            exit(EXIT_FAILURE);
        }

        size_t length = 0;
        ssize_t read;
        const char* backup;

        while ((read = getline(&s, &length, fd) ) > 0)
        {
            backup = s;
            if (A() && *s == '\n')
            {
                printf("%sis in the language\n", backup);
            }
            else
            {
                fprintf(stderr, "%sis not in the language\n", backup);
            }
        }
        fclose(fd);

        return 0;
    }

3 个答案:

答案 0 :(得分:1)

您需要使用C ++样式代码才能以跨平台方式使用getline。

#include <fstream>
#include <string>

using namespace std;

std::string s;

bool A() { return true; }

int main(int argc, char *argv[])
{
    ifstream myfile("input.txt");
    if(!myfile.is_open())
    {
        fprintf(stderr, "Unable to open input.txt\n");
        return 1;
    }

    size_t length = 0;
    size_t read;
    std::string backup;

    while (getline(myfile, s))
    {
        backup = s;
        if (A() && s == "\n")
        {
            printf("%s is in the language\n", backup.c_str());
        }
        else
        {
            fprintf(stderr, "%s is not in the language\n", backup.c_str());
        }
    }

    return 0;
}

答案 1 :(得分:1)

您似乎对各种template< class CharT, class Traits, class Allocator > std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>& input, std::basic_string<CharT,Traits,Allocator>& str, CharT delim ); 函数签名感到困惑。

标准C ++ std::getline签名是

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

它需要一个输入流对象,一个字符串和一个字符分隔符(还有一个没有分隔符的重载)。

posix getline签名是

istream

再次使用分隔符可选。

现在在您的代码中传递参数,就像调用没有分隔符的posix版本一样。如果您想使用标准版本,则必须更改参数(即FILE*对象而不是fputs)。我不知道posix是否可用,因为posix与任何C ++标准不同。

请注意,FILE*fprintf,{{1}}是C文件处理函数,而不是C ++函数。

答案 2 :(得分:1)

你想用getline(&s, &length, fd)做什么?您是否尝试使用C getline

假设您已正确打开文件,在c ++中,您的getline应如下所示:getline(inputStream, variableToReadInto, optionalDelimiter)

  • 您未包含<stdio.h>,但确实包含<fstream>。也许使用ifstream fd("input.txt");
  • 什么是A()
  • 如果您尝试使用C getlineusing namespace std可能会干扰
  • 您为何使用printffprintf而非cout << xxxxxxfd << xxxxxx