c ifstream для преобразования в символ *

#c #string #pointers #char #ifstream

#c #строка #указатели #символ #ifstream

Вопрос:

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

Ответ №1:

Вы просто помещаете свой char * в std::stringstream .

 std::stringstream buffer(your_string);
  

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

 void parse(std::istream amp; input);
  

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

Комментарии:

1. Почему stringstream , а не istringstream нет? Зачем дополнительная сложность, которая ему, похоже, не нужна?

2. @Джеймс: Хорошая мысль. Я предполагаю, что это моя плохая привычка всегда использовать, stringstream даже если ostringstream или istringstream было бы достаточно.

3. @Джеймс: в чем разница между istringstream и stringstream?

4. @ghiboz То же самое, что и разница между ifstream и fstream . stringstream является двунаправленным, со всем дополнительным управлением, которое это накладывает. (На практике я никогда не использую двунаправленные потоки; идиома на самом деле не подходит, и они имеют разную семантику в зависимости от типа потока.)

Ответ №2:

 #include <sstream>
#include <fstream>
#include <iostream>

using namespace std;

void mung( istream amp; 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 );
    }
}
  

Ответ №3:

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

Комментарии:

1. Интересно, почему предпочтение отдается istrstream?

2. @непредвзятая простота. И, может быть, привычка, в какой-то степени, но если у него есть char[] (на который указывает a char* ), то istrstream может использовать его напрямую; istringstream потребуется преобразование в string . Не имеет большого значения, и если бы istrstream он был недоступен, я бы использовал istringstream , но поскольку это так, почему бы не использовать stream, который может делать именно то, что вам нужно. (Для вывода разница более существенна, поскольку ostrstream при выводе слишком большого количества символов произойдет остановка и объявление ошибки.)