2015-12-02 64 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