Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Программирование. Вопрос по работе с текстовыми файлами.

guasha_ Ученик (87), открыт 5 дней назад
Здравствуйте, такой вопрос, есть текстовый файл (данные на скрине), как можно считать из него только числа после знака "=" и вывести их массивом 10 на 10 на с++?
7 ответов
RatÆCat Оракул (61803) 5 дней назад
Проходиться по строкам и считывать символы после равно до пробела
Лёша Брунько Гуру (4869) 5 дней назад
Хорошо что я мимер, свободный человек, и мне не нужно с этой кашей возиться
Николай Веселуха Высший разум (371376) 5 дней назад
 #include <array> 
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>
using namespace std;
int main() {
ifstream inp("data.txt");
if (!inp.is_open()) exit(0);
constexpr size_t n = 10;
array<array<int, n>, n> matrix{};
int ch{};
for (auto& row : matrix) {
for (auto& value : row) {
ch = inp.get();
while (ch != EOF && ch != '=') ch = inp.get();
if (ch == EOF) break;
inp >> value;
}
if (ch == EOF) break;
}
inp.close();
for (const auto& row : matrix) {
for (auto value : row) {
cout << setw(4) << value;
}
cout.put('\n');
}
}
D P Мудрец (18208) 5 дней назад
  1. Сканируем строку, разбиваем ее на поля по пустым символам (например при помощи методов find_first_not_of и find_first_of из string)
  2. Из каждого поля пытаемся выделить субполя, используя в качестве знака разделителя символ равенства (например при помощи find).
  3. Если выделение прошло успешно, то пытаемся преобразовать выделенное субполе с числом в число и сохраняем его в векторе, если преобразование было успешным. А если вместо числа был мусор то выводим сообщение об ошибке
  4. Если не достигнут конец данных, то переходим к пункту №1
Вообще на Си++ это все делать не очень удобно, так как его библиотека работы со строками не содержит ряда полезных вещей. Если делать все правильно, то код получится достаточно большим, а если делать, как показано в ответах выше, то велик шанс получить мусор и узнать об этом только когда будет уже поздно. В качестве демонстрации вышеизложенного подхода привожу код на Rust
 static  DATA: &str = 
"A11=15 A12=28 A13=2 A14=47\n
*/*/*/*/*/*/*/*/*/*/*/*/*/*/\n

A21=20 A22=19 A23=12 A24=48\n
*/*/*/*/*/*/*/*/*/*/*/*/*/*/\n

A31=3 A32=47 A33=41 A34=45
*/*/*/*/*/*/*/*/*/*/*/*/*/*/\n

";

fn main()
{
// Разобъем данные сначала на строки, а потом строки на отдельные поля,
// отсеяв предварительно часть мусора, а потом поля превратим в числа
// Сохраним результат в вектре из вектров чисел
let num_vec: Vec::<Vec::<i32>> = DATA.lines()
// Отсеим мусор
.filter(|s| s.contains('='))
.map(|s|
// Преобразование строки в набор строковых полей
s.split_whitespace()
// Разбор поля на субполя и преобразование в число
.filter_map(|f|
match f.rsplit_once('=')
{
Some((_,val)) =>
{
Some( i32::from_str_radix(val, 10)
.expect("Ошибка преобразования числа в строку") )
},
None => None
}
)
.collect()
)
.collect();

// Выведем результат на экран
for row in num_vec
{
println!("{:?}", row);
}
}
Для не знакомого с Rust человека код может выглядеть странно, поэтому поясню - тут используется конвейер из адаптеров итераторов, которые постепенно делают то, что нам нужно а collect() в самом конце собирает все данные в вектор.
Сергей Гений (59938) 4 дня назад
 #include <iostream>  
#include <fstream>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
ifstream inp("N:/test.txt"); //в кавычках имя файла
vector<vector<int>> arr;
string str;
while (getline(inp, str))
{
vector<int> tmp; int num;
istringstream stringa(str);
while (stringa.ignore(INT_MAX, '=')&&stringa >> num && (tmp.push_back(num), true));
if (tmp.size()) arr.emplace_back(tmp);
}
for (auto i : arr)
{
for (auto j : i) cout << j << "\t"; cout << "\n";
}
}
Похожие вопросы