Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 16.06.2016
Сообщений: 6
1

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

16.06.2016, 18:59. Показов 1994. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем здравия!
Я новичок в С++, и у меня существует большая необходимость в решении следующей задачи:
чтение входного текстового (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;
}
Подскажите пожалуйста пути решения задачи! Буду очень признателен за помощь!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2016, 18:59
Ответы с готовыми решениями:

Построчное чтение из текстового файла
Подскажите плз, как считать не только первую строку, но и все последующие в файле? #include...

Построчное чтение из текстового файла .txt
Имеется текстовый файл fin.txt, в котором построчно записана информация подобным типом: Марка...

Построчное чтение текстового файла и работа со строками
Добрый день уважаемые участники. Хотел попросить у Вас помощи, стоит задача-создать функцию,...

Из текстового файла считать массив целых чисел
Из текстового файла input.txt считать массив целых чисел. Предполагается, что количество чисел в...

5
385 / 279 / 478
Регистрация: 09.05.2014
Сообщений: 769
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;
}
1
1 / 1 / 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();
для печати количества найденных строк для информативности.

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

У меня сейчас возник другой вопрос: как организовать возможность использования большого количества "шаблонов" условий поиска строк с использованием все тех же интервалов чисел!
0
1 / 1 / 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() это фактически лексемы, из которых составлены грамматики в виде вышеописанных условий. Вопрос в том, что я не представляю как это можно описать.

Помогите пожалуйста советом!
Заранее благодарен!
0
21.06.2016, 22:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2016, 22:49
Помогаю со студенческими работами здесь

Чтение построчное из текстового файла в массив
Нужно считать данные из текстового файла в массив. Вроде, как всё считывает, но перезаписывает...

Построчное чтение текстового файла в массив
Подскажите пожалуйста как это релизовать? Убил почти целый день на поиск решения в интернете, и не...

Построчное чтение текстового файла
Уважаемые господа, возник вопрос, так как я начинающий прошу сильно не пинать. Необходимо...

Построчное чтение из текстового файла
Здравствуйте! Имеется такая вот задача: В теории все понятно - создать массив структур с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru