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

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

Войти
Регистрация
Восстановить пароль
 
malishev
9 / 9 / 0
Регистрация: 17.12.2012
Сообщений: 123
#1

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

29.05.2013, 20:25. Просмотров 609. Ответов 9
Метки нет (Все метки)

Здравствуйте.
Прочитал кучу форумов, но нигде не нашел ответа на свой вопрос.
Имеется текстовый в котором хранится прямоугольная матрица 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");
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 20:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание массива из файла (C++):

Считывание элементов массива из файла, где в первой строке можно задавать размерность массива - C++
Разработать программу для работы с одномерным массивом. Ее функции: - считывание элементов массива из файла (txt), где в первой строке...

Считывание массива из файла - C++
Помогите, пожалуйста с заданием. Дедлайн завтра. Не пойму как реализовать ( Надеюсь на Вашу помощь. спасибо. Из файла (имя файла...

Считывание массива из файла - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main () { int i,j; int matr1; FILE *f1;

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

Считывание из файла массива данных - C++
подскажите как исправить, данная программа считывает и выводит только первый объект. а необходимо, чтобы все, находящиеся во входном файле ...

Считывание из файла массива строк - C++
Ув. товарищи! Помогите плз. Нужно реализовать функцию, заполняющую из файла массив строк. Что то типа такого: bool...

9
DiffEreD
1431 / 768 / 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 удобнее было бы.
1
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
0
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.05.2013, 20:43 #4
Так в какой массив считывать - одномерный или двумерный?
0
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
0
DiffEreD
1431 / 768 / 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;
}
1
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");
}
}
0
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.05.2013, 21:27 #8
Сорри, ваш код слишком сложен для меня, может вам кто нибудь другой поможет.
0
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++)
А как с вектором сделать я пока не понимаю
0
DiffEreD
1431 / 768 / 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';
}
0
29.05.2013, 21:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 21:40
Привет! Вот еще темы с ответами:

Считывание одномерного массива из файла - C++
Доброго времени суток! Проблема в следующем: 1. Кусочек кода из main() case 2: { file(data); delete data; ...

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

Считывание двумерного массива из текстового файла - C++
Столкнулся с проблемой при компиляции в C++ Builder ( File1.cpp(29): E2062 Invalid indirection Full parser context ...

Чтения файла, массивы, считывание массива - C++
Здравствуйте, задание у меня такое, в файле &quot;input.txt&quot; записана строчка Например: DEFDEFVERDEFBIRBIRDEFDEF В программе нужно написать...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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