как преобразовать ifstream в istringstream



У меня есть функция, которая читает через istringstream и делает некоторые операции над ним так ... Я пытаюсь прочитать в файле с помощью fstream и преобразовать объект fstream в 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);
811   4  

4 ответов:

То, что вы хотите, это std::istream_iterator:

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

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

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

  • Измените свой алгоритм на не нужен istringstream.

Нельзя преобразовать std::ifstream непосредственно в std::istringstream.

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

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

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

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

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

4 4x

X-это опечатка.

Если Вы читаете его:

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

A и b будут равны 4. Но в следующий раз, когда вы будете читать, он потерпит неудачу из-за x.

Вместо этого прочитайте: в каждой строке в строку:

#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, независимо от того, откуда он исходит.

Comments

    Ничего не найдено.