Как читать из программы на С ++ до чтения символа, затем пропустить некоторые символы и продолжить чтение снова - PullRequest
4 голосов
/ 02 апреля 2012

Как мне читать из файла, пока не будет достигнут определенный символ, а затем перейти к следующему символу и продолжить чтение на c ++.

В моей программе я использую некоторый синтаксис HTML и генерирую htm-файл... Так что в моем коде c ++ я добавил теги ... но когда я читаю из моего htm-файла, я хочу, чтобы он не включал теги.

Что я планирую делать, так это читать файл до '<'встречается, тогда просто ищите точку, пока не встретится'> ', и продолжайте чтение оттуда ..

Пожалуйста, помогите мне и направьте меня в этом .. Я не очень опытен в выводе файлов в c ++.. Спасибо ..:)

Ответы [ 4 ]

5 голосов
/ 02 апреля 2012

Прежде всего, вы должны знать, что делать это правильно немного сложнее, чем вы думаете.

Просто отвечая на вопрос в том виде, в котором вы его задали, вы можете использовать istream::get, чтобы прочитать символ за раз, пока не получите '<'. Вы можете использовать <code>ignore, чтобы игнорировать символы до следующего '>' в потоке.

Однако вернемся к первому пункту, который обычно не будет работать правильно. В частности, для тега вполне возможно содержать строку, а строка (в свою очередь) содержит «>», что означает , а не закрытие тега. Таким образом, чтобы надеяться на правильный синтаксический анализ HTML, вам нужно проанализировать строки внутри тегов, и, когда вы их найдете, пропустите их содержимое, а не обрабатывайте любые символы «>», которые они могут содержать, как завершающие тег.

3 голосов
/ 02 апреля 2012

Как правило, чтобы прочитать файл, пока не будет достигнут определенный символ, вы используете std::getline и задаете второй параметр для вашего терминатора, так что если вы читаете до символа «<», вы можете сделать </p>

std::getline( infile, str, '<' );

затем вы можете сделать то же самое с > символом

В вашем случае, если вы анализируете HTML, то, вероятно, для него уже есть определенные парсеры.Я думаю, что HTML1.1 совместим с XML, но HTML1.0 не так, как не всегда было необходимо закрывать все ваши теги, поэтому синтаксический анализатор XML не обязательно будет работать.

Вы должны предположить, что открыт изакрывающие теги не являются частью комментариев или цитируемого текста, и методология, которую я описал выше, не обещает вам, что вам понадобится полный конечный автомат.

1 голос
/ 02 апреля 2012

Следующее чтение из стандартного ввода;изменить / заменить вызовы getchar () для чтения из другого места.

int c;

c = getchar();
while ( c != EOF ) {
    while ( c != '<' && c != EOF) {
        /* Do something with character outside tag? */
        c = getchar();
    }
    while ( c != '>' && c != EOF ) {
        /* Do something with character inside tag? */
        c = getchar();
    }
}    
1 голос
/ 02 апреля 2012

Вот некоторые рекомендации.

  • Вы можете прочитать файл построчно с getLine из ifstream и сохранить каждую строку в std::string

  • Вы можете использовать метод std::string.find() для поиска < и > символов.

  • Вы можете использовать метод std::string.substr() для получения подстрок.

  • Вы можете сгруппировать строки, если необходимо, в std::vector.

Вы не получите полную реализацию здесь, но этого должно быть достаточно, чтобы вы начали.

...