2015-12-02 2 views
0

Итак, у меня возникли трудности с созданием функции getline в моем коде, и это было связано с неправильной структурой вызова.ifstream Class Resolution для 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 решается с помощью обычной станд библиотеки , хотя он является членом класса ifstream. По моему мнению, класс ifstream является членом iostream.

Почему:

std::ifstream::getline 

не работает?

Спасибо!

ответ

0

Причина, по которой std::getline, которая принимает std::string является «свободная функция» в 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 с и позволяет не беспокоиться о выделении буфера и т.д.

+0

Я вижу. Думаю, мне нужно выяснить, как структурируются различные стандартные библиотеки. Благодаря! – alphasierra

+0

@JohnZwinck правильно объяснил, почему исторически библиотека 'iostreams' не использовала библиотеку' string' и наоборот (поскольку 'C++ 11' это не совсем верно, потому что std :: ifstream & Co now [имеет конструктор из 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