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

Построчное чтение целых чисел из текстового файла с занесением в массив для анализа - C++

Восстановить пароль Регистрация
 
RedUct0R
 Аватар для RedUct0R
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 6
16.06.2016, 18:59     Построчное чтение целых чисел из текстового файла с занесением в массив для анализа #1
Доброго всем здравия!
Я новичок в С++, и у меня существует большая необходимость в решении следующей задачи:
чтение входного текстового (input.txt) файла, содержащего 6 столбцов и не фиксированное количество сток целых чисел, разделенных знаком табуляции с занесением в динамический массив. Чтение и запись в массив должно выполняться построчно.
Далее, в полученном исходном массиве ищутся строки, в которых первое число находится в диапазоне от 20 до 29 и 2 числа (из оставшихся 4-х) находятся в диапазоне от 1 до 9. Найденная строка чисел заносится в другой массив, который по окончании работы записывается в выходной файл (output.txt) также построчно, с указанием в конце количества полученных строк.

Пример входного файла:
15 2 7 44 8 3
22 15 8 30 2 18
18 3 79 32 28 5
14 44 83 12 6 55
27 3 14 83 55 9

В этом примере 2-я и 5-я строки подпадают под условие анализа, и должны быть занесены в отдельный массив, а затем в файл (output.txt).

На данный момент я смог реализовать только чтение из файла и вывод на экран (в качестве средства тестирования). Однако, чтение произвожу в char, и преобразовать в int никак не получается! Была мысль использовать парсер для поиска строк по условию, подключил Boost, но в синтаксисе Spirit-а пока разобраться не могу... Скорее всего это будет оптимальный вариант, но для меня пока сложновато.

Вот мой код (пишу в VS2015):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
 
int main()
{
    ifstream fin("c:\\input.txt");
 
    if (fin.is_open()) {
 
        ifstream fin;
        fin.open("c:\\input.txt");
        char ch;
        while (fin.get(ch))
            cout << ch;
        fin.close();
        system("pause");
    }
    else {
        cout << "File not found" << endl;
        system("pause");
    }
 
    return 0;
}
Подскажите пожалуйста пути решения задачи! Буду очень признателен за помощь!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2016, 18:59     Построчное чтение целых чисел из текстового файла с занесением в массив для анализа
Посмотрите здесь:

C++ Построчное чтение из файла!
C++ Построчное чтение из текстового файла
C++ Чтение из текстового файла массив структур
Чтение комплексных чисел из текстового файла C++
C++ Построчное чтение из файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lawr
 Аватар для lawr
351 / 245 / 120
Регистрация: 09.05.2014
Сообщений: 741
18.06.2016, 17:14     Построчное чтение целых чисел из текстового файла с занесением в массив для анализа #2
ну вот как-то так переводим:
C++
1
2
3
4
5
6
7
8
9
10
11
        while (fin.get(ch)){
            if (ch >= 48 && ch <= 57)
            {
                num *= 10;
                num += (ch - 48);
            }
            else {
                std::cout << num << ch;
                num = 0;
            }
        }
но я думаю можно и не переводить. число в диапазоне от 20 до 29- это символ с кодом 50, за которым следует любой другой символ в диапазоне [48; 57], после которого идет не числовой символ. число от 1 до 9 по аналогии. короче, переписываешь из файла в массив char (или гораздо удобней писать строку в string а string-и пихать в vector) и там уже ищешь по условию- так по крайней мере мне это все видится. от новичка новичку если чо

Добавлено через 3 часа 47 минут
вот, чтоб было понятно что я имел ввиду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
bool num(char ch){
    if (ch >= '0'&&ch <= '9')
        return true;
    return false;
}
bool GoodString(std::string s){
    int q = 0;
    if (s[0] != '2'||!num(s[1])||s[2]!=' ')
        return false;
    for (int i = 3; i < s.size(); i++)
        if (num(s[i]) && !num(s[i - 1]) && !num(s[i + 1]))
        {
            q++, i++;
            if (q == 2)
                return true;
        }
    return false;
}
using namespace std;
 
int main()
{
    std::string Temp;
    std::vector<std::string> Table;
    ifstream fin("c:\\input.txt");
 
    if (fin.is_open()) {
 
        ifstream fin;
        fin.open("c:\\input.txt");
        while (!fin.eof()){
            getline(fin, Temp);
            if (GoodString(Temp))
                Table.push_back(Temp);
        }
 
        fin.close();
        ofstream fout("c:\\output.txt");
        for (int i = 0; i < Table.size(); i++)
            fout << Table[i] << '\n';
        fout.close();
        system("pause");
    }
    else {
        cout << "File not found" << endl;
        system("pause");
    }
 
    return 0;
}
RedUct0R
 Аватар для RedUct0R
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 6
20.06.2016, 09:17  [ТС]     Построчное чтение целых чисел из текстового файла с занесением в массив для анализа #3
Искренне благодарю за столь подробное объяснение, lawr!!!
Буду пробовать!

Добавлено через 1 час 41 минуту
В
C++
1
if (s[0] != '2'||!num(s[1])||s[2]!=' ')
заменил на
C++
1
s[2]!='\t'
, т.к. у меня в файле числа разделены знаком табуляции, а не пробела.
И после
C++
1
fout << Table[i] << '\n';
вставил
C++
1
fout << "\n" << Table.size();
для печати количества найденных строк для информативности.

Еще раз выражаю огромную благодарность за помощь!!!
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
20.06.2016, 09:29     Построчное чтение целых чисел из текстового файла с занесением в массив для анализа #4
Цитата Сообщение от RedUct0R Посмотреть сообщение
Однако, чтение произвожу в char, и преобразовать в int никак не получается!
У вас чтение через поток. Используйте его также как cin. Да, да, вот так прям и пишите fin>>intValue, само все распарсит.
RedUct0R
 Аватар для RedUct0R
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 6
20.06.2016, 13:06  [ТС]     Построчное чтение целых чисел из текстового файла с занесением в массив для анализа #5
Благодарю за ценную подсказку! Возможно и придется переделать с учетом перевода в int.

У меня сейчас возник другой вопрос: как организовать возможность использования большого количества "шаблонов" условий поиска строк с использованием все тех же интервалов чисел!
RedUct0R
 Аватар для RedUct0R
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 6
21.06.2016, 22:49  [ТС]     Построчное чтение целых чисел из текстового файла с занесением в массив для анализа #6
Уважаемые знатоки и эксперты!!!

Помогите пожалуйста определить направление, в котором двигаться! Задача усложнилась: необходимо в входном массиве чисел найти строки, удовлетворяющие 450 условиям, наподобие того, что было в исходной задаче.

Постараюсь описать условия для поиска:

Пусть D0 - интервал чисел 0 - 9
D1 - 10 - 19
D2 - 20 - 29
D3 - 30 - 39
D4 - 40 - 49

Далее:
P - 2 числа, принадлежащие одному из интервалов D()
PP - 4 числа, принадлежащие двум разным интервалам D()
PPP - 6 чисел, принадлежащие трем разным интервалам D()
Q - 4 числа, принадлежащие одному из интервалов D()
QP - 4 числа одного интервала D() и 2 числа другого интервала D()
S - 6 чисел, принадлежащие одному из интервалов D()
T - 3 числа, принадлежащие одному из интервалов D()
TP - 3 числа одного интервала D() и 2 числа другого интервала D()
TT - 3 числа одного интервала D() и 3 числа другого интервала D()
V - 5 чисел, принадлежащие одному из интервалов D()

Самое интересное!

Пришлось ввести формальную запись для условий. Например:

1D0PP; 1-первое число в строке принадлежит D0, среди оставшихся 5-ти есть 4 числа, принадлежащие двум разным интервалам D() за исключением D0 (в противном случае это будет уже T)

Теперь условия:

1D0PP; 1D0P; 1D0T; 1D0TP; 1D0Q; 1D0V
2D0PP; 2D0TP; 2D0PPP; 2D0P; 2D0QP
3D0TP; 3D0T; 3D0TT
4D0Q; 4D0QP
5D0V
6D0 (это фактически S)

Аналогично для D1, D2, D3 и D4.
Т.е

1D1PP; 1D1P; 1D1T; 1D1TP; 1D1Q; 1D1V
2D1PP; 2D1TP; 2D1PPP; 2D1P; 2D1QP
3D1TP; 3D1T; 3D1TT
4D1Q; 4D1QP
5D1V
6D1
и т.д.

Как мне это видится: D() это фактически лексемы, из которых составлены грамматики в виде вышеописанных условий. Вопрос в том, что я не представляю как это можно описать.

Помогите пожалуйста советом!
Заранее благодарен!
Yandex
Объявления
21.06.2016, 22:49     Построчное чтение целых чисел из текстового файла с занесением в массив для анализа
Ответ Создать тему
Опции темы

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