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

Как считать матрицу из файла без указания размерности? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.89
Lil Crazy
 Аватар для Lil Crazy
5 / 5 / 1
Регистрация: 23.03.2009
Сообщений: 198
29.05.2009, 21:30     Как считать матрицу из файла без указания размерности? #1
Как считать матрицу из файла без указания размерности?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2009, 21:30     Как считать матрицу из файла без указания размерности?
Посмотрите здесь:

Считать матрицу из файла C++
C++ считать матрицу из текстового файла
C++ считать матрицу с файла
C++ Как считать матрицу из файла в двумерный вектор
Как считать матрицу 3*3 из файла если он там задан неправильно C++
C++ ifstream (считать матрицу из файла в двумерный вектор)
C++ Не могу считать матрицу из файла в динамический массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Даемоник
 Аватар для Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
29.05.2009, 21:55     Как считать матрицу из файла без указания размерности? #2
А что подразумевается под
без указания размерности?
Lil Crazy
 Аватар для Lil Crazy
5 / 5 / 1
Регистрация: 23.03.2009
Сообщений: 198
29.05.2009, 21:59  [ТС]     Как считать матрицу из файла без указания размерности? #3
То есть матрица будет только введена матрица. Например:
1 2 3
4 5 6
7 8 9
и всё. Размерность матрицы (в данном случае это 3х3) не указана.
Alik-Soldier
9 / 9 / 0
Регистрация: 01.05.2009
Сообщений: 127
29.05.2009, 22:08     Как считать матрицу из файла без указания размерности? #4
Если элементы матрицы написаны через пробел,то воспользуйся функциями fgets() и strtok().
Lil Crazy
 Аватар для Lil Crazy
5 / 5 / 1
Регистрация: 23.03.2009
Сообщений: 198
29.05.2009, 22:16  [ТС]     Как считать матрицу из файла без указания размерности? #5
А пример в коде можно показать??? А то я совсем не понимаю
Alik-Soldier
9 / 9 / 0
Регистрация: 01.05.2009
Сообщений: 127
29.05.2009, 22:40     Как считать матрицу из файла без указания размерности? #6
C++
1
2
3
4
5
6
7
while(feof(f))
    {
        fgets(buff,10,f);
        p = strtok(buff," ");
        arr[i]=atoi(buff);
        i++;
    }
Только массив arr[] динамический
Даемоник
 Аватар для Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
29.05.2009, 22:42     Как считать матрицу из файла без указания размерности? #7
Вот я что-то такое предполагаю должно работать:
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
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
#define size 256
 
 
int main()
{
    FILE *file;
    fopen("File.txt","r");  //Тут открываю файл для чтения
    int **arr;              //Создаю массив, в который мы
    *arr=new int [size];    //будем записывать матрицу
     for (int i = 0; i < size; i++)
     {
        for (int i = 0; i < size; i++)
        {
            arr[i]=new int [size];
        }
     }
    while (feof(file)==0)   //Посимвольно считываю
    {
        if (fgetc(file)!=32) //Определяю пробел(по коду ASCII)
        {
            arr[size][size]=fgetc(file);
        }
        if (fgetc(file)==32)
        {
            continue;
        }
    }
}
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
29.05.2009, 22:48     Как считать матрицу из файла без указания размерности? #8
Даемоник, массив arr инициализирован не правильно...
Должно быть что то типа этого:
C++
1
2
int *arr = new int*[N];
for (int i = 0; i < N; i++) arr[i] = new int[N];
И по-моему чтобы матрицу из файла считать... придется использовать промежуточный одномерный массив... и после его заполнения, т.е. когда уже знаем количество элементов, надо заполнять двумерный массив, т.е. саму матрицу.
Даемоник
 Аватар для Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
29.05.2009, 23:01     Как считать матрицу из файла без указания размерности? #9
Да-да, извините, был неправ)
Но все же по-моему правильно двумерный массив инициализируется вот так:
C++
1
2
3
4
5
6
7
8
9
int **arr;              
    arr=new int* [size];    
     for (int i = 0; i < size; i++)
     {
        for (int j = 0; j < size; j++)
        {
            arr[i]=new int [size];
        }
     }
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
29.05.2009, 23:06     Как считать матрицу из файла без указания размерности? #10
Не совсем... смотри:
C++
1
2
3
4
for (int j = 0; j < size; j++)
                {
                        arr[i]=new int [size];// Ты несколько раз инициализируешь один и тот же массив
                }
Даемоник
 Аватар для Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
29.05.2009, 23:20     Как считать матрицу из файла без указания размерности? #11
Да, точно) Увидел ошибку)
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
29.05.2009, 23:36     Как считать матрицу из файла без указания размерности? #12
У меня вот такое получилось:
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
#include <iostream>
#include <fstream>
#include <queue>
#include <math.h>
using namespace std;
 
 
int main()
{
    ifstream in("C:\\123.txt");
    queue<int> tmp;
    int i;
    int count = 0;
    while (!in.eof()){
        in >> i;
        tmp.push(i);
        ++count;
    }
    int N = sqrt((double)count);
    int **arr = new int*[N];
    for (int z = 0; z < N; z++)arr[z] = new int[N];
    for (int z = 0; z < N; z++)
        for (int y = 0; y < N; y++){
            arr[z][y] = tmp.front();
            tmp.pop();
        }
}
Но если в файле будет не квадратная матрица...то надо немного по другому реализовать будет....
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,352
Записей в блоге: 26
29.05.2009, 23:38     Как считать матрицу из файла без указания размерности? #13
Насколько я понял, вопрос был не в том, как создавать динамический массив, а в том, как узнать, с какими размерами его создавать
Lil Crazy
 Аватар для Lil Crazy
5 / 5 / 1
Регистрация: 23.03.2009
Сообщений: 198
30.05.2009, 11:28  [ТС]     Как считать матрицу из файла без указания размерности? #14
Кое-что понял, кое-что нет Вот код:
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <fstream>
#include <queue>
using namespace std;
 
int **ReadMatrixFromFile(int &K, int &L);
int **CreateMatrix(const int K,const int L);
void FreeMatrix(int **X, const int L);
void SortMatrix(int **X, const int K, const int L);
void PrintMatrix(int **X, const int K, const int L);
void WriteMatrixToFile(int **X, const int K, const int L);
 
void main()
{  
    int K,L;
    printf("This program in each column swap the largest and smallest modulo elements.\n");
    int **X=ReadMatrixFromFile(K,L);
    printf("Initial matrix:\n");
    PrintMatrix(X,K,L);
    SortMatrix(X,K,L);
    printf("Result matrix:\n");
    PrintMatrix(X,K,L);
    WriteMatrixToFile(X,K,L);
    FreeMatrix(X,K);
    printf("The program work is completed. For exiting press Enter.\n");
    getch();
}
 
void SortMatrix(int **X, const int K, const int L)
{
    int i,j;
    int A,B;
    int min_j,max_j,buf;
    for (j=0;j<L;j++)
    {
        min_j=abs(X[0][j]);
        max_j=abs(X[0][j]);
        for(i=0;i<K;i++)
        {
            if (abs(X[i][j])>=max_j)
            {
                max_j=abs(X[i][j]);
                A=i;
            }
            if (abs(X[i][j]<=min_j))
            {
                min_j=abs(X[i][j]);
                B=i;
            }
        }
        buf=X[A][j];
        X[A][j]=X[B][j];
        X[B][j]=buf;
    }
}
 
void PrintMatrix(int **X, const int K, const int L)
{
    int i,j;
    for (i=0;i<K;i++)
    {
        for (j=0;j<L;j++)
        {
            printf("%5i",X[i][j]);
        }
        printf("\n");
    }
}
 
void FreeMatrix(int **X, const int K)
{
    int i;
    for(i=0; i<K; i++)
    {
        delete[] X[i];
    }
    delete[] X;
}
 
int **CreateMatrix(const int K,const int L)
{
    int i;
    int ** X = new int*[K];
    for(i=0; i<K; i++)
    {
         X[i] = new int[L];
    }
    return X;
}
 
void CheckingDimensionOfMatrix(const int K, const int L)
{
    if ((K<1) || (L<1)) 
    {
        printf("Matrix has the wrong dimension, that is less than unity. For exiting press Enter.\n");
        getch();
        exit(1);
    }
}
 
int **ReadMatrixFromFile(int &K, int &L)
{
    FILE *InputFile;
    char PathIn[25];
    int i,j;
    printf("Enter a path for input file: ");
    scanf("%s",PathIn); 
    if ((InputFile=fopen(PathIn, "r")) == NULL )
    {
        perror(PathIn);
        exit;
    }
    fscanf(InputFile,"%d ",&K);
    fscanf(InputFile,"%d ",&L);
    CheckingDimensionOfMatrix(K,L);
    int ** X=CreateMatrix(K,L); 
    for (i=0;i<K;i++)
    {
         for (j=0;j<L;j++)
            fscanf (InputFile,"%d ",&X[i][j]);
    }
    fclose(InputFile); 
    return X;
}
 
void WriteMatrixToFile(int **X, const int K, const int L)
{
    int i,j;
    FILE *OutputFile;
    char PathOut[25];
    printf("Enter a path for output result file: ");
    scanf("%s",PathOut);  
    OutputFile=fopen(PathOut,"w+");
    for (i=0;i<K;i++)
    {
        for (j=0;j<L;j++)
        {
            fprintf(OutputFile,"%4d",X[i][j]);
        }
        fprintf(OutputFile,"\n");
    }
    fclose(OutputFile); 
}
 
/*int **ReadMatrixFromFile(int &K, int &L)
{
    FILE *InputFile;
    char PathIn[25];
    int i,j;
    int **X;
    printf("Enter a path for input file: ");
    scanf("%s",PathIn); 
    if ((InputFile=fopen(PathIn, "r")) == NULL )
    {
        perror(PathIn);
        exit;
    }
    *X=new int [K];    
    for (j = 0; j < L; j++)
        {
            X[i]=new int [K];
        }
    while (feof(InputFile)==0) 
    {
        if (fgetc(InputFile)!=32)
        {
            X[K][L]=fgetc(InputFile);
        }
        if (fgetc(InputFile)==32)
        {
            continue;
        }
    }
    return X;
}*/
 
/*int **ReadMatrixFromFile(int &K, int &L)
{
    FILE *InputFile;
    char PathIn[25];
    int i,j;
    ifstream in("C:\\in2.txt");
    queue<int> tmp;
    int count = 0;
    while (!in.eof())
    {
        in >> i;
        tmp.push(i);
        ++count;
    }
    int N = sqrt((double)count);
    int **X = new int*[N];
    for (int z = 0; z < N; z++) X[z] = new int[N];
    for (int z = 0; z < N; z++)
        for (int y = 0; y < N; y++)
        {
            X[z][y] = tmp.front();
            tmp.pop();
        }
    return X;
}*/
Не закомментированная функция ReadMatrixFromFile нормально работает, но я её писал для заданной размерности в файле. Как бы мне теперь её переделать без указания размерности в файле (матрица не квадратная)???!!!
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,352
Записей в блоге: 26
30.05.2009, 11:46     Как считать матрицу из файла без указания размерности? #15
Цитата Сообщение от Lil Crazy Посмотреть сообщение
Не закомментированная функция ReadMatrixFromFile нормально работает, но я её писал для заданной размерности в файле. Как бы мне теперь её переделать без указания размерности в файле (матрица не квадратная)???!!!
А у тебя именно такая поставновка задачи или как?

Могу предложить такой вариант. Читаешь весь файл в какой-то текстовый буффер. Дальше тебе нужно понять, сколько в этом буффере чисел, сколько строк и сколько в каждой строке элементов. И давай для простоты будем считать, что файл сформирован правильно (т.е. нет такого, что в одной строке 3 числа, а в другой 4).

Для начала проще всего сделать двухпроходную схему. На первом проходе делаешь нарезку буффера на отдельные элементы, полагая, что разделителем между числами являются пробелы и знаки энтера. Нарвавшись на первый энтер, ты уже должен знать количество числе, которые ты нашёл в строковом представлении (сами числа пока можно не запоминать) - т.е. фактически ты вычислил количество столбцов в первой строке файла (и мы считаем, что файл у нас правильный, а потому ты выяснил количество столбцов твоей матрицы). В итоге при первом обходе буффера ты вычислишь сколько всего чисел было в файле, а так же количество столбцов. Одно делишь на другое, получается количество строк. Далее ты создаёшь матрицу с нужными размерностями и на втором проходе её зполняешь
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
30.05.2009, 12:08     Как считать матрицу из файла без указания размерности? #16
Выглядеть будет примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
using namespace std;
 
void main(){
    ifstream in("C:\\123.txt");
    char i[128];
    int a = 0 ,b = 0;
    while (true){
        in.read(i, 1);
        if (i[0] == ' ')++b;
        if (i[0] == '\n'){
            ++a;
            ++b;
        }
        if (in.eof()){
            ++a;
            ++b;
            break;
        }
    }
    b = b/a;
}
а - число строк, b - число столбцов.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,352
Записей в блоге: 26
30.05.2009, 12:10     Как считать матрицу из файла без указания размерности? #17
При этом файл с матрицей надо будет составлять аккуратно. В начале строк пробелов быть не должно. Между числами должен быть ровно один пробел
sge
0 / 0 / 0
Регистрация: 19.05.2009
Сообщений: 8
30.05.2009, 14:37     Как считать матрицу из файла без указания размерности? #18
те надо ее именно вывести?
просто проще рассматривать не как матрицу а как текст. В char массив вносить строки и все.
Lil Crazy
 Аватар для Lil Crazy
5 / 5 / 1
Регистрация: 23.03.2009
Сообщений: 198
30.05.2009, 15:54  [ТС]     Как считать матрицу из файла без указания размерности? #19
FunDuck, вот как я использовал ваш код:
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
int **ReadMatrixFromFile(int &K, int &L)
{
    ifstream in("C:\in2.txt");
    char i1[128];
    int i,j;
    int K1=0,L1=0;
    while (true)
    {
        in.read(i1,1);
        if (i1[0]==' ') ++L1;
        if (i1[0]=='\n')
        {
            ++K1;
            ++L1;
        }
        if (in.eof())
        {
            ++K1;
            ++L1;
            break;
        }
    }
    L1=L1/K1;
    int ** X=CreateMatrix(K1,L1); 
    for (i=0;i<K1;i++)
    {
         for (j=0;j<L1;j++)
            ifstream in("C:\in2.txt");
    }
    K=K1;
    L=L1;
    return X;
}
Матрица считывается, но вот так она считывает матрицу
1 2 3
4 5 6
7 8 9
как
-842150451-842150451-842150451
-842150451-842150451-842150451
-842150451-842150451-842150451
Как избавится от этого неправильного формата???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2009, 16:22     Как считать матрицу из файла без указания размерности?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
30.05.2009, 16:22     Как считать матрицу из файла без указания размерности? #20
Ну дак ты матрицу X то вообще не заполняешь
Так как то надо:
C++
1
2
3
4
5
6
7
int temp;
    for (i=0;i<K1;i++){
        for (j=0;j<L1;j++){
            in >> temp;
            X[i][j] = temp;
            }    
        }
Только файл заново открой.
Yandex
Объявления
30.05.2009, 16:22     Как считать матрицу из файла без указания размерности?
Ответ Создать тему
Опции темы

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