Для начала вам может понадобиться несколько ярлыков в том, как вы пишете цикл над строками, чтобы сделать его более понятным. Вот обычный цикл чтения строки за раз с использованием iostreams C ++:
#include <fstream>
#include <iostream>
#include <string>
int main ( int, char ** )
{
std::ifstream file("sample.html");
if ( !file.is_open() ) {
std::cerr << "Failed to open file." << std::endl;
return (EXIT_FAILURE);
}
for ( std::string line; (std::getline(file,line)); )
{
// process line.
}
}
Что касается внутренней части, обрабатывающей линию, то здесь есть несколько проблем.
- Не компилируется. Я полагаю, это то, что вы имели в виду под "Я не могу заставить это работать". Задавая вопрос, это та информация, которую вы, возможно, захотите предоставить, чтобы получить хорошую помощь.
- Существует путаница между именами переменных
temp
и tempString
и т. Д.
string::find()
возвращает большое положительное целое число для обозначения недопустимых позиций (size_type
без знака), поэтому вы всегда будете входить в цикл, если не найдено совпадение, начинающееся с позиции символа 0
, в этом случае вы, вероятно, сделать хотите войти в цикл.
Вот простой тестовый контент для sample.html
.
<html>
<a href="foo.pdf"/>
</html>
Вставить следующее внутри цикла:
if ((line.find("href=") != std::string::npos) &&
(line.find(".pdf" ) != std::string::npos))
{
const std::size_t start_pos = line.find("href");
std::string temp = line.substr(start_pos+6);
const std::size_t stop_pos = temp.find("\"");
std::string result = temp.substr(0, stop_pos);
std::cout << "'" << result << "'" << std::endl;
}
Я действительно получаю вывод
'foo.pdf'
Однако, как отметил Джерри, вы, возможно, не захотите использовать это в производственной среде. Если это простое домашнее задание или упражнение по использованию библиотек <string>
, <iostream>
и <fstream>
, то продолжайте такую процедуру.