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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
#1

Функция чтения столбцов чисел из текстового файла - C++

07.01.2014, 01:02. Просмотров 2208. Ответов 29
Метки нет (Все метки)

Необходима функция, которая откроет текстовый файл, прочтет заранее заданное количество столбцов в массив массивов.
В файле находятся не меньше одного столбца чисел записанных в одном из возможных форматов: 1234.213455 или -5.78786E-5.
До этого реализовывал на C#: читал в строки, затем регулярным выражением выбирал только то, что подходит, складывал в листы, затем перекладывал в массив массивов.
Сейчас изучаю С++ на реальных заданиях, прошу помощи.
Пишу в Qt.

Добавлено через 2 часа 49 минут
Чтение файла построчно с заполнением в массив, так правильно?

C++ (Qt)
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
#include <iostream>
#include <fstream>
 
int main()
{
    using std::cin;
    using std::cout;
 
    const int imax = 10;
    fstream inp_str();
    inp_str.open("C:/Exp.txt", ios::in);
 
    string arr [imax];
    int i;
 
    if(!inp_str)
    {
        cout << "Error!";
        return 0;
    }
 
    for(i = 0; i < imax; i++)
    {
        inp_str >> arr[i];
        cout << arr[i];
    }
 
    return 0;
}
Добавлено через 7 минут
Остается вопрос о том как спарсить из каждой строки первые N совпадений.
(регулярное выражение для чисел у меня есть)
А также как быть с тем, что количество строк заранее неизвестно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 01:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция чтения столбцов чисел из текстового файла (C++):

Шаблонная функция для чтения целых чисел, дробных, строк из файла - C++
Необходимо написать шаблонную функцию для чтения целых чисел, дробных, строк из файла. С числами все работает. Но при чтении строк...

Функция чтения из файла - C++
Написал программу которая в зависимости от выбора пункта меню, записывает данные в файл или читает их. Все было нормально пока не дошел...

Функция чтения из файла - C++
Здравствуйте, пытаюсь написать функцию, которая бы выводила информацию из файла, без функции код выглядит так: ifstream infileout; ...

Функция для чтения из файла в матрицу - C++
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;fstream&gt; using namespace std; void setvector(vector&lt;vector&lt;int&gt; &gt; matrix,...

Нужен пример кода чтения из файла, сравнение и функция рандом - C++
Нужен пример кода -Открываем файл -Считываем содержимое(будет 4 числа) -Очищаем файл -Записываем в файл 4 случайных числа...

Функция, возвращающая k-ю строку текстового файла - C++
*/ Описать функцию getLine(Name,k) строкового типа, возвращающую k-ю строку текстового файла с именем Name (строки нумеруются от 0). Если...

29
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 13:37  [ТС] #16
alsav22,
По поводу чисел. Числа в разных форматах, поэтому хочу использовать регулярное выражение для каждой строки и брать оттуда первые N (заданное количество столбцов) вхождений.

"Массив массивов" - опечатка, конечно же двумерный массив.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.01.2014, 13:43 #17
Цитата Сообщение от Glevera Посмотреть сообщение
Числа в разных форматах
Для форматируемого чтения (>>) без разницы, лишь бы формат был правильный для чисел.
1
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 13:48  [ТС] #18
alsav22, Вы имеете в виду, что перечисленные ниже числа в строке прочтутся как числа без проблем, и не нужны никакие регулярные выражения?
2345092 -345985 0.32453997 -3345.34562 -5.78786E-5
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.01.2014, 13:48 #19
Может скажете в чём цель? Чтобы понятно было, что нужно сделать.
Цитата Сообщение от Glevera Посмотреть сообщение
конечно же двумерный массив.
Двумерный массив чего?

Добавлено через 29 секунд
Цитата Сообщение от Glevera Посмотреть сообщение
alsav22, Вы имеете в виду, что перечисленные ниже числа в строке прочтутся как числа без проблем, и не нужны никакие регулярные выражения?
2345092 -345985 0.32453997 -3345.34562 -5.78786E-5
Конечно. Это нормальный формат записи чисел.
1
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 13:55  [ТС] #20
alsav22, double вероятно.

Добавлено через 5 минут
А есть что-то более точное и удобное в вычислениях кроме double?
0
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 13:58  [ТС] #21
У меня как раз тоже сейчас получилось.
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
#include <iostream>
#include <fstream>
 
using namespace std;
int main()
{
    using std::cin;
    using std::cout;
 
    const int imax = 356;
    ifstream inp_str;
    inp_str.open("C:/Exp.txt");
 
    double arr [imax];
    int i;
 
    if(!inp_str)
    {
        cout << "Error!";
        return 0;
    }
 
    for(i = 0; i < imax; i++)
    {
        inp_str >> arr[i];
        cout << arr[i] <<"\t";
    }
 
    return 0;
}
0
alsav22
07.01.2014, 14:03
  #22

Не по теме:

Цитата Сообщение от Glevera Посмотреть сообщение
У меня как раз тоже сейчас получилось.
Какое совпадение...

0
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 14:10  [ТС] #23
  1. А как прочитать файл до конца? Я сейчас конкретное число чисел из файла читал, а хотелось бы знать сколько строк прочитано.
  2. Также возникает вопрос, а что если в одной из строк будет меньше/больше чисел, чем N?
    В С# я брал из каждой строки первые N вхождений регуляркой, это гарантировало чтение N чисел из каждой строки. Если вхождений было меньше N, чтение файла прекращалось.
  3. Что будет, если одно из чисел будет записано неправильно?
    В С# правильность гарантировалась регуляркой.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.01.2014, 15:11 #24
Цитата Сообщение от Glevera Посмотреть сообщение
А как прочитать файл до конца?
C++
1
2
3
4
5
6
i = 0;
while (inp_str >> arr[i])
{
    cout << arr[i] <<"\t";
    ++i;
}
Только массив должен быть подходящего размера. А так как количество чисел в файле не известно, то читать в vector <double>.

Добавлено через 6 минут
Цитата Сообщение от Glevera Посмотреть сообщение
Также возникает вопрос, а что если в одной из строк будет меньше/больше чисел, чем N? В С# я брал из каждой строки первые N вхождений регуляркой, это гарантировало чтение N чисел из каждой строки. Если вхождений было меньше N, чтение файла прекращалось.
Тут столько решений, что лень писать.

Добавлено через 1 минуту
Цитата Сообщение от Glevera Посмотреть сообщение
Что будет, если одно из чисел будет записано неправильно?
Тут посложнее, но тоже есть решение. Сейчас пример выложу.

Добавлено через 30 минут
В вектор будут записаны числа только в правильном формате:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vector <double> v;
        double n;
        cout.precision(9);
        while (true)
        {
            fin >> n;
            if (fin && (fin.peek() == ' ' || fin.peek() == '\n'))
            {
                v.push_back(n);
                cout << n << ' ';
            }
            else
            {
                if (fin.eof()) break;
                fin.clear();
                while (fin.peek() != ' ' && fin.peek() != '\n' && fin.peek() != EOF)
                    fin.get();
            }
        }
1
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 15:32  [ТС] #25
[QUOTE=alsav22;5604315]
C++
1
2
3
4
5
6
i = 0;
while (inp_str >> arr[i])
{
    cout << arr[i] <<"\t";
    ++i;
}
У меня при выполнении все удачно, но в конце такая ошибка.
https://www.dropbox.com/s/93ygj5kxjs...2015.03.29.png
Это из-за того, что не контролируется закончился файл или нет, да?
0
Ev_Hyper
Заблокирован
07.01.2014, 15:40 #26
Glevera, отладку запустите и увидите на что ругаеться
0
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 15:55  [ТС] #27
https://www.dropbox.com/s/gkqs9ozpf2...2015.49.57.png
Такое вот при отладке...
Количество строк - 400, размер массива - 402.
0
Ev_Hyper
Заблокирован
07.01.2014, 16:03 #28
Glevera, а как вы задаете arr?
0
Glevera
14 / 14 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 16:35  [ТС] #29
Ev_Hyper,
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
#include <iostream>
#include <fstream>
 
using namespace std;
int main()
{
    using std::cin;
    using std::cout;
 
    const int imax = 402;
    ifstream inp_str;
    inp_str.open("C:/Exp.txt");
 
    double arr [imax];
    int i = 0;
 
    if(!inp_str)
    {
        cout << "Error!";
        return 0;
    }
 
    while (inp_str >> arr[i])
    {
        cout << arr[i] <<"\t";
        ++i;
    }
 
    return 0;
}
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.01.2014, 18:56 #30
Цитата Сообщение от Glevera Посмотреть сообщение
Количество строк - 400, размер массива - 402.
Количество строк - не количество чисел в файле. Чисел больше, вот и не помещаются в массив. Советовал же читать в вектор (24 пост).
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
#include <iostream>
#include <fstream>
 
using namespace std;
int main()
{
    using std::cin;
    using std::cout;
 
    const int imax = 402;
    ifstream inp_str;
    inp_str.open("C:/Exp.txt");
 
    double arr [imax];
    int i = 0;
 
    if(!inp_str)
    {
        cout << "Error!";
        return 0;
    }
 
    while ((i < imax) && (inp_str >> arr[i]))
    {
        cout << arr[i] <<"\t";
        ++i;
    }
 
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2014, 18:56
Привет! Вот еще темы с ответами:

Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт - C++
Здравствуйте, задача такова есть файл, размером 1000 байт, нужно открыть его считать 100 байт, после чтения закрыть. Потом опять открыть...

Функция fopen() для большого текстового файла читает только первую строку - C++
Есть текстовой файл 4.5 мб, нужно его открыть для чтения из него строк. FILE *f = fopen(&quot;C:\\members.txt&quot;, &quot;r&quot;); Это мне...

Запись чисел из текстового файла - C++
Доброго времени суток. Имеется текстовый файл, в котором дан номер элемента (химического), далее название самого элемента, а на следующей...

Добавить в конец первого текстового файла содержимое второго текстового файла - C++
Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
07.01.2014, 18:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru