#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[]
(на который указывает achar*
), тоistrstream
может использовать его напрямую;istringstream
потребуется преобразование вstring
. Не имеет большого значения, и если быistrstream
он был недоступен, я бы использовалistringstream
, но поскольку это так, почему бы не использовать stream, который может делать именно то, что вам нужно. (Для вывода разница более существенна, посколькуostrstream
при выводе слишком большого количества символов произойдет остановка и объявление ошибки.)