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

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

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

Студворк — интернет-сервис помощи студентам
Как считать матрицу из файла без указания размерности?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.05.2009, 21:30
Ответы с готовыми решениями:

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

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

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

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

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

Для начала проще всего сделать двухпроходную схему. На первом проходе делаешь нарезку буффера на отдельные элементы, полагая, что разделителем между числами являются пробелы и знаки энтера. Нарвавшись на первый энтер, ты уже должен знать количество числе, которые ты нашёл в строковом представлении (сами числа пока можно не запоминать) - т.е. фактически ты вычислил количество столбцов в первой строке файла (и мы считаем, что файл у нас правильный, а потому ты выяснил количество столбцов твоей матрицы). В итоге при первом обходе буффера ты вычислишь сколько всего чисел было в файле, а так же количество столбцов. Одно делишь на другое, получается количество строк. Далее ты создаёшь матрицу с нужными размерностями и на втором проходе её зполняешь
0
692 / 383 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
30.05.2009, 12:08
Выглядеть будет примерно так:
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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.05.2009, 12:10
При этом файл с матрицей надо будет составлять аккуратно. В начале строк пробелов быть не должно. Между числами должен быть ровно один пробел
0
0 / 0 / 1
Регистрация: 19.05.2009
Сообщений: 8
30.05.2009, 14:37
те надо ее именно вывести?
просто проще рассматривать не как матрицу а как текст. В char массив вносить строки и все.
0
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
30.05.2009, 15:54  [ТС]
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
Ну дак ты матрицу 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2009, 16:22
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru