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

Чтение из файла в Матрицу - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 20:59     Чтение из файла в Матрицу #1
Добрый Ночи! Всем классного настроения!

Ищу совета от более опытных пользователей.

Подскажите, пожалуйста, как можно читать в матрицу(массив) из файла, для реализации моего проекта.

Матрица готова, посчиталась и сохранилась в файл. Теперь нужно взять загрузить из файла на экран по очереди каждую строчку, и при желании крутить туда сюда.

Кликните здесь для просмотра всего текста
3 2 -5 -1 2 -1 3 13 1 2 -1 9
1 2 -1 9 2 -1 3 13 3 2 -5 -1
1 2 -1 9 2 -1 3 -5 3 2 -5 -1
1 2 -1 9 0 -1 3 -5 3 2 -5 -1
1 2 -1 9 0 -5 3 -5 3 2 -5 -1
1 2 -1 9 0 -5 5 -5 3 2 -5 -1
1 2 -1 9 0 -5 5 -5 3 2 -5 -1
1 2 -1 9 0 -5 5 -5 3 2 -5 -28
1 2 -1 9 0 -5 5 -5 0 2 -5 -28
1 2 -1 9 0 -5 5 -5 0 -4 -5 -28
1 2 -1 9 0 -5 5 -5 0 -4 -2 -28
1 2 -1 9 0 -5 5 -5 0 -4 -2 -28
1 2 -1 9 0 -5 5 -5 0 -4 -2 -24
1 2 -1 9 0 -5 5 -5 0 0 -2 -24
1 2 -1 9 0 -5 5 -5 0 0 -6 -24

Конечно, сохранение можно как угодно подправить.

т.е. пример матрицы имеет вид:
3x+2y-5z=-1
2x-y+3z=13
x+2y-z=9

Я читаю к примеру так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    std::ifstream in("out.txt"); 
    if (!in.is_open())
    {
        std::cout << " Файл " << "out.txt" << " не был открыт для чтения. ";
        return;
    }
    double **A2 = new double *[n], *B2 = new double[n]; //инициализация динамических массивов
    for (int i = 0; i < n; i++)
    A2[i] = new double[m];
        for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            in >> A[i][j]; // матрица А
 
        }
        in >> B[i];  // матрица B
 
    }
    in.close();
Если я прочитаю 2 раза:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
 
                in >> A2[i][j];
            }
            in >> B2[i];
 
        }
        DisplayMatrix(A2, B2, n, m);
 
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
 
                in >> A2[i][j];
            }
            in >> B2[i];
 
        }
        DisplayMatrix(A2, B2, n, m);
Соответственно, он читает 1 строку, а потом и вторую. Но таких строк более 10, и как мне их потом обратно крутить?
Никак не могу придумать решение.
Чтение из файла в Матрицу



Буду Очень благодарен за совет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 20:59  [ТС]     Чтение из файла в Матрицу #41
alsav22, Четно говоря, не задавался вопросом, делаю по примеру курсовую работу.

Думаю, можно и пропустить 3 шаг, прыгнуть сразу на 4.

По словам препода, нужно крутить программу, вперед назад, с любого момента. (соответственно кроме начала, где еще некуда возвращаться и конца, где некуда уже идти вперед). Типо пользователь будет смотреть что и где изменилось в данных, понимая что происходит и как вообще решается задача.
Я это же буду показывать и защищать перед комиссией. (ужас какой на первом курсе). Если подумать об этом, то повтор шага, будет плюсом мне - Демонстрировать программу, т.е. в строка N изменилась в шаге два, если вдруг упустили что-то, вернулись еще раз показали.... Уже сам запутался во всем этом.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 23:30     Чтение из файла в Матрицу #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
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
#include <iostream>
#include <fstream>
using namespace std;
 
const int N = 5;
 
struct data
{
    int arr[N];
};
 
void show(data d) // вывод структуры
{
    for (int i = 0; i < N; ++i)
        cout << d.arr[i];
    cout << endl;
}
 
void read(ifstream& fin) // чтение и вывод структуры из файла
{
    data temp;
    if (fin.read((char*)&temp, sizeof(temp)))
    {
        show(temp);
    }
    else
    {
        cout << "The end of the file!" << endl;
        return;
    }
}
 
void step(ifstream& fin, char ch) // передвижение по структурам в файле
{
    if (ch == '1') // чтение и вывод очередной структуры
    {
        read(fin); 
    }
    else if (ch == '2') // чтение и вывод предыдущей структуры
    {
        int offset;
        if (fin.eof()) // если курсор в конце файла
        {
            offset = sizeof(data); // то размер смещения равен структуре (на последнюю в файле)
            fin.clear();
        }
        else
            offset = sizeof(data) * 2; // если курсор не в конце файла, то размер смещения равен двум структурам
        
        fin.seekg(-offset, ios::cur); // переход по смещению
        if (fin) // если не вышли за начало файла
        {
           read(fin);
        }
        else 
        {
            cout << "The beginning of the file!" << endl;
            // выводится первая структура в файле
            fin.clear();
            fin.seekg(0); 
            read(fin);
        }
    }
}
 
int main()
{
   const int M = 9; 
   data d[M];
   for (int i = 0; i < 9; ++i)
       for (int j = 0; j < 5; ++j)
          d[i].arr[j] = i + 1;
 
   ofstream fout("1.data", ios::binary);
   fout.write((const char*)d, sizeof(d[0]) * M);
   fout.close();
 
   // в файла, в бинарном виде, массив структур. В каждом массиве по N целых чисел
   // Величина числа соответствует номеру записи струкруры в файле (нумерация с 1).
 
   ifstream fin("1.data", ios::binary);
   if (!fin)
       cout << "Error!" << endl;
   else
   {
        char ch;
        do
        {
            cin >> ch; // 1 - шаг вперёд, 2 - шаг назад, 0 - выход
            if (ch == '0')
                break;
 
            step(fin, ch);
            
        } while (true);
   }
   
   system("pause");
   return 0;
}
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 23:44  [ТС]     Чтение из файла в Матрицу #43
alsav22, Благодарю за хороший пример! Завтра после работы попробую реализовать!
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
09.04.2014, 22:56  [ТС]     Чтение из файла в Матрицу #44
alsav22, Добрый день! Извиняюсь за беспокойство. Хорошего Вам настроения!

Вот, нашел время для учебы. Все вроде понял, но появился новый вопрос.

Я никак, получается, не могу задать размер массива в структуре во время программы?
т.е. он уже определен: const int N = 5;
C++
1
2
3
4
5
6
const int N = 5;
 
struct data
{
    int arr[N];
};
т.е. получается,
C++
1
const int N = 5;
грубо говоря, строка в 5 цифр.
C++
1
2
const int M = 9; 
   data d[M];
const int M = 9; кол-во строчек.

Я не владею такой информацией, почитал немного, ничего не нашел. (буду рад советам что читать).

Или в моем случае нужно обращать взор на классы?
Просто, для конкретного примера выставлю размерность, а если будет размер другой, то вывод будет иной....
Спасибо!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2014, 00:38     Чтение из файла в Матрицу #45
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Просто, для конкретного примера выставлю размерность, а если будет размер другой, то вывод будет иной....
Я выложил работающий пример передвижения по структурам в файле, если структруры записаны в бинарном режиме. Информацию к размышлению. Какая структура нужна для вашей задачи (один массив или не один массив), какая размерность массива там нужна (пять или не пять), и т.д. - это вам решать. Сколько структур в файл записывать (девять или не девять) - это тоже вам решать.

Добавлено через 26 минут
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Или в моем случае нужно обращать взор на классы?
Класс или структура - разница небольшая, но структура (объект с фиксированным размером) под вашу матрицу (или отдельно, под вот это: 3x+2y-5z=-1 (может быть нужна структура, в которой будут три такие структуры)) - напрашивается.

Добавлено через 3 минуты
О "Решениях СЛАУ методом Гаусса" понятия не имею, поэтому подсказать что-то конкретное, по организации данных для этой задачи, не смогу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2014, 00:42     Чтение из файла в Матрицу
Еще ссылки по теме:

C++ Чтение из файла
Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. C++
Чтение файла с несколькими знаками конца файла C++

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

Или воспользуйтесь поиском по форуму:
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
10.04.2014, 00:42  [ТС]     Чтение из файла в Матрицу #46
alsav22, Понял! Благодарю.
Yandex
Объявления
10.04.2014, 00:42     Чтение из файла в Матрицу
Ответ Создать тему
Опции темы

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