Одним из решений является сохранение списка проверок, которые вы хотите сделать, а затем циклическое их выполнение.Для каждой проверки прочитайте строку и посмотрите, соответствует ли она:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> validLines {
"#FIRST",
"this is a comment",
"#SECOND"
};
std::istringstream fileStream { // pretend it's a file!
"#FIRST\n" \
"this is a comment\n" \
"this line should fail\n"};
std::string fileLine;
for (auto const& validLine : validLines) {
// for every validity check, read a line from the file and check it
if (!std::getline(fileStream, fileLine)) {
std::cerr << "Failed to read from file!\n";
return 1;
}
if (validLine == fileLine) { // could be a regex check
std::cout << "good\n";
}
else {
std::cout << "bad\n";
}
}
}
Это будет читать только те строки, для которых у вас есть проверка.Если в файле будет больше строк, они вообще не будут прочитаны.
Также обратите внимание, я сделал несколько упрощений, используя строку вместо файла и используя простое совпадение вместорегулярное выражение, но это не имеет никакого значения для бит, который вам небезразличен.
Просто для удовольствия, вот другой подход, если вам нужно только проверить определенные номера строк:
#include <iostream>
#include <sstream>
#include <string>
#include <unordered_map>
int main()
{
using LineCheckMap = std::unordered_map<std::size_t, std::string>;
LineCheckMap validLines {
{3, "#SECOND"}
};
std::istringstream fileStream { // pretend it's a file!
"#FIRST\n" \
"this is a comment\n" \
"this line should fail\n"};
std::string fileLine;
std::size_t lineCount {0};
while (std::getline(fileStream, fileLine)) {
// for every line in the file, add to a counter and check
// if there is a rule for that line
++lineCount;
LineCheckMap::const_iterator checkIter = validLines.find(lineCount);
if (std::end(validLines) != checkIter) {
if (checkIter->second == fileLine) {
std::cout << "good\n";
}
else {
std::cout << "bad\n";
}
}
}
}