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

Считывание массива из файла - C++

Восстановить пароль Регистрация
 
malishev
9 / 9 / 0
Регистрация: 17.12.2012
Сообщений: 123
29.05.2013, 20:25     Считывание массива из файла #1
Здравствуйте.
Прочитал кучу форумов, но нигде не нашел ответа на свой вопрос.
Имеется текстовый в котором хранится прямоугольная матрица m*n.
как считать эту матрицу из файла в массив на языке c++(я так понял в динамический массив)
У меня получилось только со считыванием размерности из файла
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
 {
     char filename[80];
         std::cout<<rus("Введите путь к файлу:  ")<<endl;
        cin>>filename;
        std::ifstream ifs(filename);
        if(ifs.is_open())
        {
            ifs >> n >> m;
            for (i = 0; i < n; i++)
                for (j = 0; j < m; j++)
                    ifs >> a[i][j];
            if(!ifs)
            {
                std::cerr <<rus( "Ошибка чтения из файла\n")<<endl;
                system("pause");
            }
            ifs.clear();
            ifs.close();
        }
        else
        {
            std::cerr <<rus ("Невозможно открыть файл\n")<<endl;
            system("pause");
        }
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.05.2013, 20:39     Считывание массива из файла #2
Ну, смотрите, если в файле числа расположены одна за другой без каких либо знаков пунктуации и букв, то можна сразу все их считать в динамический контейнер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
 
int main ()
{    
    std::ifstream ifs("D:/file_of_ints.txt");
    if (ifs.is_open())
    {
        std::vector<int> v_ints((std::istream_iterator<int>(ifs)), std::istream_iterator<int>());
    }
    else
        std::cout<<"Error...";
    
    std::cout<<std::endl;
    return 0;
}
Добавлено через 3 минуты
Если в двумерный массив надо, то тут уже циклами for удобнее было бы.
malishev
9 / 9 / 0
Регистрация: 17.12.2012
Сообщений: 123
29.05.2013, 20:40  [ТС]     Считывание массива из файла #3
Дан двумерный массив(прямоугольная матрица, элементы расположены через пробел)
примерно так:
1 2 3 4
4 5 6 3
1 5 6 1
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.05.2013, 20:43     Считывание массива из файла #4
Так в какой массив считывать - одномерный или двумерный?
malishev
9 / 9 / 0
Регистрация: 17.12.2012
Сообщений: 123
29.05.2013, 20:45  [ТС]     Считывание массива из файла #5
yuron_477, в двумерный массив нужно считать прямоугольную матрицу m*n такого вида:
1 2 3 4
4 5 6 3
1 5 6 1
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.05.2013, 21:07     Считывание массива из файла #6
Я бы примерно так сделал (двумерный массив на основе векторов):
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
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
 
int main ()
{
    std::ifstream ifs("D:/matrix.txt");
    if (ifs.is_open())
    {
        std::string line;
        std::istringstream iss;
        std::vector<std::vector<int> > matr;
        while(std::getline(ifs, line))
        {
            iss.str(line);
            matr.push_back(std::vector<int>((std::istream_iterator<int>(iss)), std::istream_iterator<int>()));
            iss.clear();
        }
        for (int i = 0; i<matr.size(); ++i)
        {
            std::copy(matr[i].begin(), matr[i].end(), std::ostream_iterator<int>(std::cout, " "));
            std::cout<<'\n';
        }
        
    }
    else
        std::cout<<"Error...";
    
    std::cout<<std::endl;
    return 0;
}
malishev
9 / 9 / 0
Регистрация: 17.12.2012
Сообщений: 123
29.05.2013, 21:20  [ТС]     Считывание массива из файла #7
yuron_477, Я ни разу не пользовался векторами и не знаю, как обращаться к элементам массива, не могли бы вы вставить ваш код в мою программу. Жирным я выделил то место, которое нужно заменить
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cmath>
#include <iomanip>
#include <fstream>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <locale.h>
using namespace std;
    char* rus(const char* text) 
{
    char *buffRus=new char[strlen(text)];
    CharToOem(text, buffRus);
    return buffRus;
}
int main()
{
 
    int c ,n, m, i, j, k, x, y, a[100][100];
 
     std::cout<<rus ("для того, чтобы заполнить случайно нажмите 0 \nДля того, чтобы заполнить вручную нажмите 1 \n\Для того чтобы заполнить из файла нажмите 2 ")<<std::endl;
     cin >> c;
     system("cls");
    if (c == 0)
    {
          std::cout<<rus("Введите количество строк: ")<<std::endl;
        cin >> n;
          std::cout<<rus("Введите количество столбцов: ")<<std::endl;
        cin >> m;
        system("cls");
        srand(time(NULL));
        for (i=0;i<=n-1;i++)
        {
            for (j=0;j<=m-1;j++)
            {
                srand(rand()%20);
                a[i][j]=rand()%10;
                cout << a[i][j] << "\t";
            }
            cout << endl;
        }
    }
    else if (c == 1)
    {
          std::cout<<rus("Введите количество строк: ")<<endl;
        cin >> n;
         std::cout<<rus("Введите количество столбцов: ")<<endl;
        cin >> m;
        system("cls");
          std::cout<<rus("Введите матрицу: \n")<<endl;
        for (i = 0; i < n; i++)
            for (j = 0; j < m; j++)
 
                    cin >> a[i][j];
    }
    [B]else if (2 == c)
    {
     char filename[80];
         std::cout<<rus("Введите путь к файлу:  ")<<endl;
        cin>>filename;
        std::ifstream ifs(filename);
        if(ifs.is_open())
        {
            ifs >> n >> m;
            for (i = 0; i < n; i++)
                for (j = 0; j < m; j++)
                    ifs >> a[i][j];
            if(!ifs)
            {
                std::cerr <<rus( "Ошибка чтения из файла\n")<<endl;
                system("pause");
            }
            ifs.clear();
            ifs.close();
        }
        else
        {
            std::cerr <<rus ("Невозможно открыть файл\n")<<endl;
            system("pause");
        }
    }[/B]
    system("cls");
      std::cout<<rus("Исходная матрица") << endl;
    for (i = 0; i < n; i++)
    {   for (j = 0; j < m; j++)
        {
            cout << a[i][j] << "\t";
        }
        cout << endl;
    }
 
     std::cout<<rus("\nКвадратные подматрицы с одинаковым колличеством четных и нечетных чисел: \n")<<endl;
 
    std::ofstream ofs("out.txt");
    if(ofs.is_open())
    {
        for (k = 2; k <= min(n, m); k += 2)
        {
            for (i = 0; i <= n - k; i++)
            {
                for (j = 0; j <= m - k; j++)
                {
                    int q0 = 0, q1 = 0;
 
                    for (x = 0; x < k; x++)
                        for (y = 0; y < k; y++)
                            if ((a[i+x][j+y] & 1) == 0)
                                q0++;
                            else
                                q1++;
 
                    if (q0 == q1)
                    {
                        cout << "===============================================\n";
                        for (x = 0; x < k; x++)
                        {
                            for (y = 0; y < k; y++)
                                cout << std::setw(6) << std::left << a[i+x][j+y];
                            cout << '\n';
                        }
                        cout << '\n';
 
 
                        ofs << "===============================================\n";
                        for (x = 0; x < k; x++)
                        {
                            for (y = 0; y < k; y++)
                                ofs << std::setw(6) << std::left << a[i+x][j+y];
                            ofs << '\n';
                        }
                        ofs << '\n';
                    }
                }
            }
        }
        ofs.close();
    }
    else
        std::cerr << "Unable to open output file\n";
 
    system("pause");
    return 0;
}
Добавлено через 2 минуты
Жирный шрифт не получился, вставить нужно между else if (2 == c) и std::cerr <<rus ("Невозможно открыть файл\n")<<endl;
system("pause");
}
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.05.2013, 21:27     Считывание массива из файла #8
Сорри, ваш код слишком сложен для меня, может вам кто нибудь другой поможет.
malishev
9 / 9 / 0
Регистрация: 17.12.2012
Сообщений: 123
29.05.2013, 21:30  [ТС]     Считывание массива из файла #9
yuron_477, А объяснить сможете, как обратиться к самой матрице, мне ее в дальнейшем нужно обрабатывать.
обычно я делал это так
C++
1
2
for (i = 0; i < n; i++)
                for (j = 0; j < m; j++)
А как с вектором сделать я пока не понимаю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 21:40     Считывание массива из файла
Еще ссылки по теме:

Считывание массива из файла C++
Считывание одномерного массива из файла C++
C++ Считывание массива объектов из файла

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.05.2013, 21:40     Считывание массива из файла #10
Обычное обращение по индексам:
C++
1
2
3
4
5
6
7
8
9
10
const int n = 10;
const int m = 20;
int arr[n][m]; //дальше заполнения массива я пропустил
    
for (int i = 0; i < n; ++i)
{
    for (int j = 0; j < m; ++j)
        std::cout<<arr[i][j]<<" ";
    std::cout<<'\n';
}
С векторами можно также, но тут может быть потенциально опасное обращение к не существуещему элементу:
C++
1
2
3
4
5
6
for (int i = 0; i<matr.size(); ++i)
{
    for (int j = 0; j<matr[0].size(); ++j)
        std::cout<<matr[i][j]<<" ";
    std::cout<<'\n';
}
Yandex
Объявления
29.05.2013, 21:40     Считывание массива из файла
Ответ Создать тему
Опции темы

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