2016-02-16 2 views
2

У меня есть функция, которая считывает через istringstream и делает некоторые операции с ним так ... Я пытаюсь прочитать в файле с помощью fstream и преобразовать fstream объект в istringstream, чтобы пройти это к моей функции. Я не знаю, как это сделать. Любая помощь приветствуется. Я все еще довольно новичок, поэтому, пожалуйста, держите его простым, если сможете.как конвертировать ifstream в istringstream

string inputFile(argv[1]);  
ifstream inFile(inputFile.c_str());  
istringstream is; 

is >> inFile.rdbuf(); //*******This is wrong and is what I'm having trouble with 

function(is); 
+3

Похож на хорошую возможность изучить полиморфизм. –

ответ

1

Что вы хотите std::istream_iterator:

std::string myString (std::istream_iterator(inputFile) , std::istream_iterator()) ; 
std::istringstream is (myString) ; 

Это создает строку с содержимым файл_ввода с помощью итератор начала (std::istream_iterator(inputFile)) и конечный итератор (std::istream_iterator()). Затем он создает поток istringstream из этой строки.

Это решает вашу непосредственную проблему, но есть почти наверняка лучший способ сделать то, что вы пытаетесь сделать. Например:

  • Передает istream вместо с istringstream (потому что тогда вы не должны копировать его).

  • Измените свой алгоритм, чтобы он не нуждался в istringstream.

1

Вы не можете преобразовать std::ifstream непосредственно к std::istringstream.

Однако, ваша функция, которая использует std::istringstream следует просто переписать использовать std::istream вместо этого, так что он может быть использован как с std::istringstream и std::ifstream.

Если вы действительно хотите взять std::ifstream, и получить std::istringstream, вы должны использовать зЬй :: istreambuf_iterator построить временный std::string, который является единственным типом параметра, что std::istringstream принимает. Но это плохой дизайн. Используйте std::istream и передайте std::ifstream напрямую.

0

Stringstream can not взять из файла, его можно взять только из строки и выдать строке. Создайте строку для хранения информации из файла с помощью getline/etc, а затем подайте это в строку. Также убедитесь, что очистили строковый поток после его использования ex. Stringstreamname.clear().

0

Не уверен, что вам нужно делать, но выходя за пределы вашего прямого вопроса, я буду держать пари, что вы хотите читать в строке вовремя, даже если вы этого еще не знаете.

В C++, если вы читаете что-либо, что не подходит, вход «застревает». Например, предположим, что вход по ошибке:

4 4x

Х опечатка.

Если вы читаете это:

int a,b; 
cin >> a >> b; 

а и Ь оба будут 4. Но в следующий раз, когда вы читали, это не из-за х.

Вместо чтения в каждой строке в строку:

#include <iostream> 
#include <sstream> 
#include <fstream> 
using namespace std; 

int main() { 
    ifstream f("input.dat"); 
    string line; 

    getline(f, line); 
    istringstream s(line); 
    int a,b; 
    s >> a >> b; 
    cout << (a + b) << '\n'; 
} 

И, конечно же, как уже говорили другие, вы должны написать код с точки зрения чтения из IStream, независимого от того, где она приходит от.