有人可以告诉我我在这里做错了什么我得到一个错误,说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;
}
答案 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()
getline
,using namespace std
可能会干扰printf
和fprintf
而非cout << xxxxxx
和fd << xxxxxx