c ++ ifstream для char * - PullRequest
       34

c ++ ifstream для char *

4 голосов
/ 11 мая 2011

мой код читает файл с помощью ifstream и анализирует его, теперь я изменил некоторые вещи, и мне не нужно читать файл, потому что он читается из другого места, поэтому у меня есть символ * вместо ifstream ...Как я могу изменить свой код, где я использую ifstream.get ()?еще раз спасибо

Ответы [ 3 ]

8 голосов
/ 11 мая 2011

Вы просто положили char * в std::stringstream.

std::stringstream buffer(your_string);

Затем вы можете использовать buffer почти так же, как это было std::ifstream (вы не можете открыть или закрыть его). В идеале, ваш метод синтаксического анализа должен принимать ссылку на std::istream в качестве параметра, тогда он не будет возражать против того, какой поток ввода он получает:

void parse(std::istream & input);

Так как std::ifstream и std::stringstream наследуются от std::istream, вы можете передать их как параметры, и ваш анализатор будет работать без изменений.

2 голосов
/ 11 мая 2011
#include <sstream>
#include <fstream>
#include <iostream>

using namespace std;

void mung( istream & is ) {
    char c;
    while( is >> c ) {
        cout << c << endl;
    }
}

int main( int argc, char *argv[] ) {
    if ( argc > 1 ) {
        ifstream ifs( argv[1] );
        mung( ifs );
    }
    else {
        istringstream iss( "here is some text to mung" );
        mung( iss );
    }
}
1 голос
/ 11 мая 2011

Как уже говорили другие, вы можете использовать std::istringstream, но в этом случае, Я бы предпочел устаревший (но всегда присутствующий) std::istrstream. Или же просто создайте простой memory_streambuf с imemorystream и omemorystream: если вам не нужно быть ни двунаправленным, ни поддерживать поиск, memory_streambuf меньше 10 строк кода, всегда полезно, и оставляет много сложности других решений. (Если вы делаете это только один раз, конечно, используя существующее решение должен быть предпочтительным. Но я нашел memory_streambuf полезным в ряд случаев.)

...