使用 getline 获取字符串对象
Posted
技术标签:
【中文标题】使用 getline 获取字符串对象【英文标题】:Taking string objects using getline 【发布时间】:2012-10-06 12:57:16 【问题描述】:我正在尝试使用 getline 将用户输入直接从控制台获取到 C++ 字符串对象中。但是我没有这样做,因为编译器给了我以下错误。
main.cpp: In function ‘int main(int, char**)’:
main.cpp:52:28: error: no matching function for call to ‘std::basic_ifstream<char>::getline(std::ifstream&, std::string&)’
main.cpp:52:28: note: candidates are:
/usr/include/c++/4.6/istream:599:5: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize, std::basic_istream<_CharT, _Traits>::char_type) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::char_type = char, std::streamsize = int]
/usr/include/c++/4.6/istream:599:5: note: candidate expects 3 arguments, 2 provided
/usr/include/c++/4.6/istream:408:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::getline(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>, std::basic_istream<_CharT, _Traits>::char_type = char, std::streamsize = int]
/usr/include/c++/4.6/istream:408:7: note: no known conversion for argument 2 from ‘std::string aka std::basic_string<char>’ to ‘int’
这里是源代码:
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <cstdio>
#define MAX_LIN 1024
using namespace std;
typedef set<int> si;
int main(int argc, char** argv)
string line1;
string line2;
map <string , si > iMap;
if (argc != 3)
fprintf(stderr,"Usage: a.out <file1> <file2>\n");
ifstream f1,f2;
f1.open(argv[1],ifstream::in);
f2.open(argv[2],ifstream::in);
while(!f1.eof())
getline(f1,line1);
mParse(line1);
while(!f2.eof())
f2.getline(f2,line2);
mParse(line2);
f1.close();
f2.close();
return 0;
【问题讨论】:
你#include <string>
了吗?请将您的包含指令添加到发布的代码中,我没有看到任何内容。
你在标题中完成#include<fstream>
了吗?
是的,我都做过。让我包括整个标题。
@humanitarian0098:学习阅读编译器消息是个好主意。它们并不总是最漂亮的,但毕竟我们必须每天与它们打交道。 std::basic_ifstream<char>::getline(std::ifstream&, std::string&)
也可以看作std::ifstream::getline(std::ifstream&, std::string&)
,这是编译器猜测你试图调用的内容。请注意它是如何表明这两种情况的:1/ 它是您正在调用的 std::ifstream
方法,以及 2/ 您将 std::ifstream&
和 std::string&
作为参数传递。
【参考方案1】:
这就是原因:
f2.getline(f2,line2);
应该是:
getline(f2,line2);
有一个std::ifstream::getline()
,但它接受不同的参数。
注意while
循环的结构不正确,因为应该在读取操作后立即检查eof()
。编码循环的常用方法是:
while (getline(f2, line2))
mParse(line2);
【讨论】:
【参考方案2】:这是规范的方式:
std::ifstream f1(argv[1]);
std::ifstream f2(argv[2]);
for (std::string line; std::getline(f1, line); )
mparse(line);
for (std::string line; std::getline(f2, line); )
mparse(line);
注意我们不写的所有内容,每一个都应该被视为大罪:eof
、open
、close
、ifstream::in
、return 0
。
【讨论】:
以上是关于使用 getline 获取字符串对象的主要内容,如果未能解决你的问题,请参考以下文章
我无法使用 cin.getline() 从用户那里获取 3 个字符串并使用指针数组来存储它们
为啥使用 getline 从标准输入获取大量输入会截断我的输入?