C ++, вычесть определенные строки? - PullRequest
4 голосов
/ 24 октября 2010

Это домашнее задание, поэтому я надеюсь, что вы, ребята, не дадите мне прямых ответов / кода, но приведите меня к решению.

Моя проблема в том, что у меня есть этот файл XXX.html, внутриесть тысячи кодов.Но мне нужно извлечь эту часть:

<html>
...
<table>
    <thead>
        <tr>
            <th class="xxx">xxx</th>
            <th>xxx</th>                       <th>xxx</th>         </tr>
    </thead>
    <tbody>
        <tr class=xxx>
        <td class="xxx"><a href="xxx" >ZZZ ZZ ZZZ</a></td>
<td>ZZZZ</td>        <td class="xxx">ZZZZ</td>    </tr>    <tr class=xxx>
<td class="xxx"><a href="xxx" >ZZZ ZZ ZZZ</a></td>
<td>ZZZZ</td>        <td class="xxx">ZZZZ</td>    </tr>    <tr class=xxx>
<td class="xxxx"><a href="xxxx" >ZZZ ZZ ZZZ</a></td>
<td>ZZZZ</td>        <td class="xxxx">zzzz</td>    </tr>    <tr class=xxx>
<td class="xxx"><a href="xxxx" >ZZZ ZZ ZZZ</a></td>
    ... and so on

Это мои текущие коды:

// after open the file
while(!fileOpened.eof()){
        getline(fileOpened, reader);
        if(reader.find("ZZZ")){
            cout << reader << endl;
        }
    }

«Считыватель» - это строковая переменная, для которой я хочу сохранитькаждая строка файла HTML.Если значение ZZZZ, как мне нужно, получится, значение изменится, какой метод я должен использовать вместо метода «найти»?(Мне очень жаль, что я не упомянул эту часть)

Но вместо того, чтобы отобразить желаемое значение, он отображает некоторые другие части html-файла.Зачем?Мой метод неверен?Если мой метод неверен, как мне извлечь значение ZZZZZ?

Ответы [ 3 ]

3 голосов
/ 24 октября 2010

std::string::find не возвращает логическое значение. Он возвращает индекс в строку, где совпадение подстроки происходит в случае успеха, иначе он возвращает std::string::npos.

Итак, вы хотели бы сказать:

    if (reader.find("ZZZ") != std::string::npos){
        cout << reader << endl;
    }
0 голосов
/ 24 октября 2010

Скелетный код для чтения строк из файла должен выглядеть следующим образом:

if( !file.good() )
  throw "opening file failed!";

for(;;) {
  std::string line;
  std::getline(file, line);
  if( !file.good() )
    break;
  // reading succeeded, process line
}

if(!file.eof())
  // error before reaching EOF

(Этот забавно выглядящий цикл проверяет условие завершения в середине цикла.вещь в C ++, поэтому вы должны использовать бесконечный цикл с перерывом в середине.)

Однако, как я сказал в комментарии к вашему вопросу, чтение HTML-кода построчно не обязательнополезно, так как HTML не опирается на определенные пробелы.

0 голосов
/ 24 октября 2010

Как правило, использование сопоставления строк не работает для извлечения значений из файла HTML. Требуется правильный анализатор HTML - они доступны для C ++ как стандартный код.

В противном случае я бы предложил использовать библиотеку регулярных выражений (boost :: regex до выхода C ++ 0x). Вы сможете писать более качественные выражения для записи интересующей вас части файла.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...