Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/37: Рейтинг темы: голосов - 37, средняя оценка - 4.59
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
1

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

29.05.2009, 21:30. Показов 7511. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как считать матрицу из файла без указания размерности?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2009, 21:30
Ответы с готовыми решениями:

Считать матрицу с файла, не зная ее размерности
Доброго времени суток. Столкнулся с проблемой, что нужно считать матрицу из файла, который имеет...

Как сделать ввод матрицы из файла без указания размера
Я сделал ввод матрицы из файла с указанием ее размера(массива),а как сделать ввод матрицы из файла...

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

Как считать матрицу 3*3 из файла если он там задан неправильно
как считать матрицу 3*3 из файла если он там задан неправильно например в файле 4 5 6 7 8 1 2 3...

19
42 / 42 / 8
Регистрация: 22.05.2009
Сообщений: 97
29.05.2009, 21:55 2
А что подразумевается под
без указания размерности?
0
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
29.05.2009, 21:59  [ТС] 3
То есть матрица будет только введена матрица. Например:
1 2 3
4 5 6
7 8 9
и всё. Размерность матрицы (в данном случае это 3х3) не указана.
0
9 / 9 / 2
Регистрация: 01.05.2009
Сообщений: 127
29.05.2009, 22:08 4
Если элементы матрицы написаны через пробел,то воспользуйся функциями fgets() и strtok().
0
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
29.05.2009, 22:16  [ТС] 5
А пример в коде можно показать??? А то я совсем не понимаю
0
9 / 9 / 2
Регистрация: 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[] динамический
0
42 / 42 / 8
Регистрация: 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;
        }
    }
}
0
692 / 383 / 51
Регистрация: 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];
И по-моему чтобы матрицу из файла считать... придется использовать промежуточный одномерный массив... и после его заполнения, т.е. когда уже знаем количество элементов, надо заполнять двумерный массив, т.е. саму матрицу.
0
42 / 42 / 8
Регистрация: 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];
        }
     }
0
692 / 383 / 51
Регистрация: 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];// Ты несколько раз инициализируешь один и тот же массив
                }
1
42 / 42 / 8
Регистрация: 22.05.2009
Сообщений: 97
29.05.2009, 23:20 11
Да, точно) Увидел ошибку)
0
692 / 383 / 51
Регистрация: 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();
        }
}
Но если в файле будет не квадратная матрица...то надо немного по другому реализовать будет....
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
29.05.2009, 23:38 13
Насколько я понял, вопрос был не в том, как создавать динамический массив, а в том, как узнать, с какими размерами его создавать
0
6 / 6 / 2
Регистрация: 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 нормально работает, но я её писал для заданной размерности в файле. Как бы мне теперь её переделать без указания размерности в файле (матрица не квадратная)???!!!
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
30.05.2009, 11:46 15
Цитата Сообщение от Lil Crazy Посмотреть сообщение
Не закомментированная функция ReadMatrixFromFile нормально работает, но я её писал для заданной размерности в файле. Как бы мне теперь её переделать без указания размерности в файле (матрица не квадратная)???!!!
А у тебя именно такая поставновка задачи или как?

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

Для начала проще всего сделать двухпроходную схему. На первом проходе делаешь нарезку буффера на отдельные элементы, полагая, что разделителем между числами являются пробелы и знаки энтера. Нарвавшись на первый энтер, ты уже должен знать количество числе, которые ты нашёл в строковом представлении (сами числа пока можно не запоминать) - т.е. фактически ты вычислил количество столбцов в первой строке файла (и мы считаем, что файл у нас правильный, а потому ты выяснил количество столбцов твоей матрицы). В итоге при первом обходе буффера ты вычислишь сколько всего чисел было в файле, а так же количество столбцов. Одно делишь на другое, получается количество строк. Далее ты создаёшь матрицу с нужными размерностями и на втором проходе её зполняешь
0
692 / 383 / 51
Регистрация: 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 - число столбцов.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
30.05.2009, 12:10 17
При этом файл с матрицей надо будет составлять аккуратно. В начале строк пробелов быть не должно. Между числами должен быть ровно один пробел
0
0 / 0 / 1
Регистрация: 19.05.2009
Сообщений: 8
30.05.2009, 14:37 18
те надо ее именно вывести?
просто проще рассматривать не как матрицу а как текст. В char массив вносить строки и все.
0
6 / 6 / 2
Регистрация: 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
Как избавится от этого неправильного формата???
0
692 / 383 / 51
Регистрация: 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;
            }    
        }
Только файл заново открой.
1
30.05.2009, 16:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2009, 16:22
Помогаю со студенческими работами здесь

Как считать информацию с файла без расширения?
Имеется файл, с него надо считать числа. Сам файл без расширения. Буду очень благодарен за...

Использование массива без указания размерности
не знаю как загугить можно ли использовать массив без указания размерности, либо как-то чтобы она...

Как считать матрицу из файла?
Необходимо считать квадратную матрицу неизвестного размера из файла. При этом нужно, чтобы память...

Копирование без указания первичного и исходного файла
подскажите пожалуйста возможно ли тут сделать копирование без указания первичного и исходного имени...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru