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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.89
Lil Crazy
6 / 6 / 1
Регистрация: 23.03.2009
Сообщений: 198
#1

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

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

Как считать матрицу из файла без указания размерности?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2009, 21:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как считать матрицу из файла без указания размерности? (C++):

Считать матрицу с файла, не зная ее размерности - C++
Доброго времени суток. Столкнулся с проблемой, что нужно считать матрицу из файла, который имеет такую структуру 4 3 2 3 7 ...

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

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

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

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

Считать матрицу из файла - C++
Как считать размерность матрицы и затем саму матрицу из файла? Добавлено через 52 минуты 53 секунды HELP!!!!!!!!!!!!!!!!!:help:

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

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

Для начала проще всего сделать двухпроходную схему. На первом проходе делаешь нарезку буффера на отдельные элементы, полагая, что разделителем между числами являются пробелы и знаки энтера. Нарвавшись на первый энтер, ты уже должен знать количество числе, которые ты нашёл в строковом представлении (сами числа пока можно не запоминать) - т.е. фактически ты вычислил количество столбцов в первой строке файла (и мы считаем, что файл у нас правильный, а потому ты выяснил количество столбцов твоей матрицы). В итоге при первом обходе буффера ты вычислишь сколько всего чисел было в файле, а так же количество столбцов. Одно делишь на другое, получается количество строк. Далее ты создаёшь матрицу с нужными размерностями и на втором проходе её зполняешь
0
30.05.2009, 11:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2009, 11:46
Привет! Вот еще темы с ответами:

считать матрицу с файла - C++
Матрица имеет такой вид, плз помогите написать код считывания с файла! заранее спасибо и файл я думаю желательно передавать как аргумент))...

Считать данные в матрицу из файла - C++
(С/С++)Как считать матрицу из файла и записать в массив. Файл содержит такой вид: 2 3 23 -4 0 -3 2 1 43

Считать матрицу из текстового файла - C++
в текстовом файле дана матрица 4 9 5 5 9 2 9 2 9 как считать этот двумерный массив и вывести его на экран? подскажите плиз(c++)

Не могу считать матрицу из файла в динамический массив - C++
Вот проблемный кусок программы: fstream f (strConst); if (! f) { cout&lt;&lt;&quot;Error_3&quot;; return 1; } int...


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

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

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