Ответ дан и принят. Ошибки были упомянуты в комментариях.
В любом случае, я хотел бы показать «более» подход C ++, использующий алгоритмы std.
Идея состоит в том, что мы хотим прочитать строку с логическими значениями. Поэтому я разработал новый тип данных, класс, который содержит такие данные, а также знает, как их читать. По моему скромному мнению, данные и методы должны быть упакованы в класс.
Это также значительно сократит количество строк кода в функции main и в целом. В определении переменной и через конструктор диапазона будут считаны все данные.
Я добавил дополнительные выходные данные для отладки, чтобы результат можно было визуализировать. Конечно, доступ к данным с помощью оператора индекса [][]
также будет работать.
Пожалуйста, смотрите:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <sstream>
std::istringstream testData(
R"#(00000000000000001111111110000
000000100000000010100000100
0000000000000000111111111000
00000000000000011111111111000
0001000000000011111111111110
00000000000000011000000011000
00000000000000100010001000100
00000000000000100000100000
00100011111111111111111001110
00000000000011111000100000001
)#");
// We want to have a data type for one line with boolean values in a string
struct Line {
// We overwrite the extractor operator >> . With that we can easily read a complete line
friend std::istream& operator >> (std::istream& is, Line& l) {
std::string line{}; l.lineOfBool.clear(); getline(is, line);
std::transform(line.begin(), line.end(), std::back_inserter(l.lineOfBool), [](const char c) { return (c == '1') ? true : false; });
return is; }
// Type cast operator to expected value
operator std::vector<bool>() const { return lineOfBool; }
// The data
std::vector<bool> lineOfBool{};
};
int main()
{
// Define the variable that will hold all bool data of the complete file. The range constructor will read the file
std::vector<std::vector<bool>> fileAsStrings{std::istream_iterator<Line>(testData),std::istream_iterator<Line>() };
// For debug purposes: Copy all Data to std::cout
std::for_each(fileAsStrings.begin(), fileAsStrings.end(), [](const std::vector<bool> & l) {std::copy(l.begin(), l.end(), std::ostream_iterator<bool>(std::cout, " ")); std::cout << '\n'; });
return 0;
}
Обратите внимание: я читаю из потока istringstream, инициализированного необработанной строкой. Таким образом, нет разницы для чтения из файла.
Может быть, кто-то найдет это решение полезным.