2015-12-02 66 views
0

所以我在编写getline函数时遇到了一些困难,这是由于调用结构不正确。ifstream getline的分辨率

所以我想了解这个调用实际上是如何工作的。

我的代码包括:

#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include <stdio.h> 
#include <iterator> 
#include <string> 
#include <vector> 
#include <unistd.h> 

所以,从那里我做了一个函数如下:

void getData(void) 
{ 
    std:string lineIn; 
    std::ifstream configFile(filePath.c_str(),std::ifstream::in); 

    std::getline(configFile,lineIn); 
} 

现在我不明白的是,为什么函数getline通过定期STD库中解析,尽管它是ifstream类的成员。根据我的理解,ifstream类是iostream的成员。

为什么:

std::ifstream::getline 

不行?

谢谢!

回答

0

的原因,这需要一个std::stringstd::getline是“免费功能”在namespace std,而不是std::istream一个“成员函数”很简单:C++的设计者不想让组件依赖C++字符串流。为什么std::ifstream构造函数将文件名作为const char*而不是std::string - 以避免不必要的模块间依赖关系。

+0

对不起,我犯了一个错字。我纠正了它。 – alphasierra

+0

@alphasierra:好的,这改变了一切!我已经更新了我的答案。 –

+0

好的,所以如果我明白,getline可以正确拉取任何类型的数据?另外为什么在C++引用中列出了以istring :: getline()形式输入的列表? – alphasierra

0
std::getline

在命名空间std一个单独的函数,而std::basic_istream::getline是同名std::basic_istream成员。

历史std::basic_istream::getline被限制在char*缓冲输入很像std::fgets()std::getline作品与std::basic_string S和让你不要理会缓冲区分配等

+0

我明白了。我想我需要弄清楚各种标准库的结构。谢谢! – alphasierra

+0

@JohnZwinck正确地解释了为什么历史上'iostreams'库没有使用'string'库,反之亦然(因为'C++ 11'不再是完全真实的,因为std :: ifstream&Co现在[具有std的构造函数: :字符串(http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream))。现在使用'std :: getline'甚至[operator >>](http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt)来输入操作是有道理的 – user3159253

+0

我得看看进入输入和输出流如何更详细地工作。谢谢你的帮助! – alphasierra