как преобразовать 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);
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.
Вместо этого прочитайте: в каждой строке в строку:
И, конечно, как говорили другие, вы должны писать свой код в терминах чтения из istream, независимо от того, откуда он исходит.#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'; }
Comments