Форум программистов, компьютерный форум CyberForum.ru

Распарсить текстовый файл - C++

Восстановить пароль Регистрация
 
Truex
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 4
02.04.2016, 16:28     Распарсить текстовый файл #1
Здравствуйте. Есть следующий файл, в который таким образом записана информация (приложение). Он состоит из множества блоков. В каждом блоке указывается к какой частице он относится (Particle). Нужно сделать так, чтобы если Particle = e-, то он считывал столбец энергий KinE (MeV), а если частица другая, то не считывал и шёл дальше (и так до конца файла). Мне кажется, что это можно как то сделать с помощью fscanf. Спасибо.
Миниатюры
Распарсить текстовый файл  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2016, 16:28     Распарсить текстовый файл
Посмотрите здесь:

Можно ли распарсить XLS файл? C++
C++ Распарсить файл 3Dmax
C++ Распарсить текстовый файл
Распарсить тексовый файл и вывести неодходимые значения в другой файл C++
C++ Распарсить xlsx-файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Truex
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 4
04.04.2016, 22:09  [ТС]     Распарсить текстовый файл #2
Ещё актуально.
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
04.04.2016, 22:29     Распарсить текстовый файл #3
Цитата Сообщение от Truex Посмотреть сообщение
Ещё актуально.
А какие у вас возникли сложности? Что именно не получается?
Truex
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 4
04.04.2016, 22:48  [ТС]     Распарсить текстовый файл #4
avgoor,
Я знаю как работать, если бы это было всё у меня в одной таблице. Тогда если бы там был столбец Particle, то я написал бы что нибудь вроде
C++
1
2
3
4
5
6
7
8
9
  while (1) {
 ncols = fscanf(infile, "%s %f %f %f %f %f\n",&id, &x, &y, &z, &KE, &dE);
 if (ncols<0) break;
 
if (Particle == e-) 
{
 
Hist->Fill(dE); //тут я заполняю гистограмму, с которой работаю
}
В итоге весь цикл бы дошёл у меня до конца файла, и так, мне кажется, я бы получил, что мне надо. Однако тут информация представлена таким образом, и я не могу понять, как можно мне сделать так, чтобы он доходя до звёздочек, проверял именно Particle на истинность, и если это e-, то шёл дальше и считывал таблицу, а если нет, то как то пропускал её и переходил к следующему блоку.

Добавлено через 4 минуты

Цитата Сообщение от avgoor Посмотреть сообщение
А какие у вас возникли сложности? Что именно не получается?
Да, только в условии if, конечно id == e-
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
05.04.2016, 00:24     Распарсить текстовый файл #5
Truex, Считываете текст построчно, сравниваете каждую считаную строку с необходимой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
do {
    std::string str;
    std::getline(file, str);
} while(str.substr(0,<лень_считать>)!="* G4TRak...partikle=e-");
 
 
for(int i=0; i<4; i++)
    std::getline(file, str) //пропускаете нужное кол-во строк
std::istringstream ss(str)
int n;
float f;
while(ss>>n)// номер шага
{
    ss>>f>>f>>f; // cчитываем 4 столбец 
    std::getline(file, str)
    ss.str(str);
}
Возвращаемся в начало.
Общая идея такова, но легче это сделать на скриптах.
Truex
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 4
05.04.2016, 20:54  [ТС]     Распарсить текстовый файл #6
avgoor, спасибо большое. Попробую разобраться.
Yandex
Объявления
05.04.2016, 20:54     Распарсить текстовый файл
Ответ Создать тему
Опции темы

Текущее время: 03:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru