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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Glevera
 Аватар для Glevera
13 / 13 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 01:02     Функция чтения столбцов чисел из текстового файла #1
Необходима функция, которая откроет текстовый файл, прочтет заранее заданное количество столбцов в массив массивов.
В файле находятся не меньше одного столбца чисел записанных в одном из возможных форматов: 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 совпадений.
(регулярное выражение для чисел у меня есть)
А также как быть с тем, что количество строк заранее неизвестно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Glevera
 Аватар для Glevera
13 / 13 / 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
07.01.2014, 14:03
  #22

Не по теме:

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

Glevera
 Аватар для Glevera
13 / 13 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 14:10  [ТС]     Функция чтения столбцов чисел из текстового файла #23
  1. А как прочитать файл до конца? Я сейчас конкретное число чисел из файла читал, а хотелось бы знать сколько строк прочитано.
  2. Также возникает вопрос, а что если в одной из строк будет меньше/больше чисел, чем N?
    В С# я брал из каждой строки первые N вхождений регуляркой, это гарантировало чтение N чисел из каждой строки. Если вхождений было меньше N, чтение файла прекращалось.
  3. Что будет, если одно из чисел будет записано неправильно?
    В С# правильность гарантировалась регуляркой.
alsav22
5282 / 4801 / 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();
            }
        }
Glevera
 Аватар для Glevera
13 / 13 / 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
Это из-за того, что не контролируется закончился файл или нет, да?
Ev_Hyper
 Аватар для Ev_Hyper
1805 / 1626 / 435
Регистрация: 15.12.2013
Сообщений: 5,773
07.01.2014, 15:40     Функция чтения столбцов чисел из текстового файла #26
Glevera, отладку запустите и увидите на что ругаеться
Glevera
 Аватар для Glevera
13 / 13 / 1
Регистрация: 29.04.2012
Сообщений: 148
07.01.2014, 15:55  [ТС]     Функция чтения столбцов чисел из текстового файла #27
https://www.dropbox.com/s/gkqs9ozpf2...2015.49.57.png
Такое вот при отладке...
Количество строк - 400, размер массива - 402.
Ev_Hyper
 Аватар для Ev_Hyper
1805 / 1626 / 435
Регистрация: 15.12.2013
Сообщений: 5,773
07.01.2014, 16:03     Функция чтения столбцов чисел из текстового файла #28
Glevera, а как вы задаете arr?
Glevera
 Аватар для Glevera
13 / 13 / 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2014, 18:56     Функция чтения столбцов чисел из текстового файла
Еще ссылки по теме:

Функция чтения из файла C++
C++ Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт
C++ Запись чисел из текстового файла

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 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;
}
Yandex
Объявления
07.01.2014, 18:56     Функция чтения столбцов чисел из текстового файла
Ответ Создать тему
Опции темы

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