Форум программистов, компьютерный форум 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, и как мне их потом обратно крутить?
Никак не могу придумать решение.
Чтение из файла в Матрицу



Буду Очень благодарен за совет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:02     Чтение из файла в Матрицу #2
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Теперь нужно взять загрузить из файла на экран по очереди каждую строчку, и при желании крутить туда сюда.
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
и как мне их потом обратно крутить?
Понятнее объясните: что в файле находится, и что нужно сделать (что значит: "крутить туда сюда" и "обратно крутить").
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 22:21  [ТС]     Чтение из файла в Матрицу #3
alsav22, Добрый вечер!
Вот полная тема матрицы Решения СЛАУ методом Гаусса по шагу Я уже исправил свои вопросы по той теме.

Основная задача, решить уравнение методом гаусса. Только нужно каждое решение выводить на экран по действию (шагу). т.е. Поменялись местами строки, сложились и др. Все по очереди выводится на экран. При нажатии на кнопку "вперед" и при нужде нажимаем кнопку "назад" соответственно, чистим экран возвращаемся на прошлый шаг.

Я решил реализоваться данное задание так:
1) заполняем матрицу
2) решаем в файл
3) после загружаем решенную матрицу из файла

У меня она вся считается как мне нужно. Все решения сохраняются в файл out.
вот эти решения:

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

у меня в таком виде сохраняются,
т.е. если все поделить выглядеть будет так:

Кликните здесь для просмотра всего текста
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


Соответственно, все из файла закидываю в массив массивов А и B.
Вот так:
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
void Step(int& n, int &m)
{
    //  system("cls");
    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 >> A2[i][j];
            }
            in >> B2[i];
 
        }
        DisplayMatrix(A2, B2, n, m);
    in.close();
 
}
первый кусочек загружается, и если еще раз вызвать, то следующий загружает из файла, но не как мне нужно.
Чтение из файла в Матрицу

Чтение из файла в Матрицу
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:33     Чтение из файла в Матрицу #4
Строки где меняете? В файле? Или там как записано, так и остаётся?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 22:36  [ТС]     Чтение из файла в Матрицу #5
Т.е. если вообще проще говорить, нужно из файла загружать по 3 цифры в первую строку A[i][j] в B[i] кидаем четвертую цифру и далее переходим на следующую строчку и так у нас выходит матрица вида:
3x+2y-5z=-1
2x-y+3z=13
x+2y-z=9
После этого у меня начинается новая строчка. Как вот можно по кнопке загружать из файла с 1 строчки по конечную и обратно в любой момент.
Спасибо за советы!

Добавлено через 1 минуту
Да, они остаются неизменными! т.к. все это уже конечные данные.
Тупо выводим все по очереди. Каждый новый вывод очищается экран. И создается эффект, что программа по шагово считает матрицу.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:44     Чтение из файла в Матрицу #6
Читаете по строке и выводите на экран, и что не так?
Что значит:
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
но не как мне нужно.
Как это выглядит (из скринов не понял)?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 22:47  [ТС]     Чтение из файла в Матрицу #7
Читается 1 строка, а как дальше выводить??? Как делать шаг назад?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:49     Чтение из файла в Матрицу #8
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Как делать шаг назад?
Назад? Опять первую читать? Или вторую?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 22:52  [ТС]     Чтение из файла в Матрицу #9
Вот часть проекта, где идет чтение из файла:
m=3, n=3
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
#include <iostream>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <string>
 
using namespace std;
 
void DisplayMatrix(double **A, double *B, int& n, int& m)
{
    cout << "\n" << endl;
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
                //  cout << setw(4) << "A[" << i << "][" << j << "] = " << A[i][j]; cout << "    B[" << i << "] = " << B[i]; //вывод 1
                //cout << endl << endl;
 
                //упрощеный вывод
                cout << setw(9) << A[i][j]; cout << setw(9) << " = " << setw(9) << B[i]; // вывод 2
            cout << endl << endl;
        }
    }
}
 
void Step(int& n, int &m)
{
    //  system("cls");
    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 >> 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);
 
    in.close();
 
}
 
void ShowHelp()
{
    //system("cls");
//  SetHighlightedText();
    cout << "Для дальнейше работы следуйте инструкции: " << endl;
    //SetNormalText();
    cout << "Нажмите '>', для вывода массива по шагам" << endl;
    cout << "Нажмите '<', для возврата предыдущего шага сортировки массива" << endl;
    cout << "Нажмите 'e', если вы хотите закончить сортировку\n" << endl;
}
void PreviousStep() //Наш массив на предыдущем шаге сортировки;
{
    //if (state > 0)
    //state--;
}
void NextStep()    //Наш массив на следующем шаге сортировки;
{
    //if (state < statesCount - 1)
    //  state++;
}
 
void Demonstrate(double **A, double*B, int& n, int &m)
{
    cout << "****************************************************************" << endl;
    //menu1(A, B, n, m);
    //DisplayMatrix(A, B, n, m);
    //cout << "****************************************************************" << endl;
    //Gauss(A, B, n, m);
    //system("pause");
    //system("cls");
    ShowHelp();
    Step(n, m);
    /*
    while (true)
    {
        char command;
        cout << " Введите команду: "; cin >> command;
 
        switch (command)
        {
        case '>':
            NextStep();
            break;
        case '<':
            PreviousStep();
            break;
        case 's':
            //  SaveToFile();
            cout << "\nПроизведено сохранение всех шагов сортировки в файл output.txt\n" << endl;
            //getch();
            break;
        case 'e':
            return;
        }
        
        //Показывает массив на текущем шаге;
        system("cls");
        ShowHelp();
        //ShowState();
    }*/
}
 
 
 
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int n, m;
    cout << "****************************************************************" << endl;
    cout << "\n" << " Введите размерность матрицы NxM " << endl;
    cout << " n= "; cin >> n; cout << " m= "; cin >> m; cout << endl;
    double **A = new double *[n], *B = new double[n]; //инициализация динамических массивов
    for (int i = 0; i < n; i++)
        A[i] = new double[m];
    Demonstrate(A, B, n, m);
    //Step(n, m);
    system("pause");
    return 0;
}

Нет не сразу, прочитали первую, перешли на вторую, третью, и после второй уже крутить назад.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 22:54  [ТС]     Чтение из файла в Матрицу #10
Кликните здесь для просмотра всего текста
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
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);
 
    in.close();


тут читается 1 строка из файла out.txt out.txt
если еще раз тоже действие, то читается и вторая строка, но как сделать это на кнопках??
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 23:00     Чтение из файла в Матрицу #11
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
но как сделать это на кнопках??
Про какие кнопки речь?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 23:09  [ТС]     Чтение из файла в Матрицу #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
while (true)
    {
        char command;
        cout << " Введите команду: "; cin >> command;
 
        switch (command)
        {
        case '>':
            NextStep(); // следующий шаг, 
            break;
        case '<':
            PreviousStep(); //предыдущий шаг
            break;
        case 's':
            //  SaveToFile();
            cout << "\nПроизведено сохранение всех шагов сортировки в файл output.txt\n" << endl;
            //getch();
            break;
        case 'e':
            return;
        }
        
        //Показывает массив на текущем шаге;
        system("cls");
        ShowHelp();
        //ShowState();
    }
К примеру так, началась работа программы, посчиталась матрица, вывелась на экран первая матрица в моем примере 3x3.
Чтение из файла в Матрицу

Нажимаем ">" очистился экран, и появилась следующая из файла и т.д.
Соответственно "<" обратный эффект.

Но пока это только надписи, как реализовать точно не знаю(
NextStep(); // следующий шаг,
PreviousStep(); //предыдущий шаг

Тут, типо счетчик какой нить крутить... ++ --
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 23:14     Чтение из файла в Матрицу #13
Если по шагам хотите (не сразу весь файл, а по две строки (если правильно понял)), то варианты такие: открытие файла сделать вне функции, в функции файл не закрывать, сделать проверку на конец файла. Другой вариант: открывать и закрывать файл в функции, сделать счётчик считанных строк, при очередном открытии файла, пропускать (ignore()) прочитанные строки, сделать проверку конца файла.

Добавлено через 1 минуту
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Нажимаем ">" очистился экран, и появилась следующая из файла и т.д.
Соответственно "<" обратный эффект.
Но пока это только надписи, как реализовать точно не знаю(
NextStep(); // следующий шаг,
PreviousStep(); //предыдущий шаг
Тут, типо счетчик какой нить крутить... ++ --
Лучше сделать структуры, считвывать весь файл в массив (вектор) структур, а потом крутите, как хотите.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 23:26  [ТС]     Чтение из файла в Матрицу #14
По одной строке ( 1 строка, 1 матрица).
Можно в вектор, но вся матрица сделана массивами, тогда препод скажет, делай или все в массивах или в векторах. Я начал делать в векторах, но почему-то все пошло не так.
И я сделал как мне проще...
В векторе и правда будет легче.
Вот по поводу игнора подумать, типо ignore(X,"\n") x- раз пропустить, или это работает только с символами?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 23:58     Чтение из файла в Матрицу #15
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
или это работает только с символами?
У вас в файле, разве, что-то другое?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 00:08  [ТС]     Чтение из файла в Матрицу #16
нет, пока не знаю, как применить игнор.... пробую
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 00:17     Чтение из файла в Матрицу #17
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
нет
Нет - это по поводу символов? В текстовом режиме, в файл записываются и из файла читаются символы (коды символов).
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 00:29  [ТС]     Чтение из файла в Матрицу #18
Да по поводу символов.
Пытаюсь понять что к чему, ввожу in.ignore(28, '\n');
т.е. игнорируем 28 символов до '\n' и новую строчку читаем.
Вроде 2 строчку читает. а вот дальше уже нет.... читаю инфу в нете...

ignore(MAX, DELIM) – извлекает и удаляет до MAX числа символов до ограничителя включительно (обычно ‘\n’); с извлеченными данными ничего не делает;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 00:33     Чтение из файла в Матрицу #19
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Пытаюсь понять что к чему, ввожу in.ignore(28, '\n');
Там у вас больше символов, чем 28. Пишите с запасом (255, например), всё равно после извлечения '\n' остановится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2014, 00:38     Чтение из файла в Матрицу
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 00:38  [ТС]     Чтение из файла в Матрицу #20
А понял, 1 строку заигнорил, ок.
Если я введу несколько раз игнор, он столько раз и заигнорит строку.
А как сделать бы это при нажатии на кнопку, и да еще и возврат...
Yandex
Объявления
06.04.2014, 00:38     Чтение из файла в Матрицу
Ответ Создать тему
Опции темы

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