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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
#1

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

05.04.2014, 20:59. Просмотров 1246. Ответов 45
Метки нет (Все метки)

Добрый Ночи! Всем классного настроения!

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

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

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

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



Буду Очень благодарен за совет.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2014, 20:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из файла в Матрицу (C++):

Переделать в коде чтение из файла в чтение с клавиатуры - C++
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен за помощь! //файл должен начинаться со слова, между...

Чтение из файла. Повторное чтение файла - C++
Добрый день. Необходимо реализовать в программе функцию повторного чтения данных из файла, в случае некорректного ввода их в оный. Вот...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла? - C++
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

Чтение файла с несколькими знаками конца файла - C++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:02 #2
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Теперь нужно взять загрузить из файла на экран по очереди каждую строчку, и при желании крутить туда сюда.
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
и как мне их потом обратно крутить?
Понятнее объясните: что в файле находится, и что нужно сделать (что значит: "крутить туда сюда" и "обратно крутить").
1
о_О_Кто_здесь
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();
 
}
первый кусочек загружается, и если еще раз вызвать, то следующий загружает из файла, но не как мне нужно.
Чтение из файла в Матрицу

Чтение из файла в Матрицу
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:33 #4
Строки где меняете? В файле? Или там как записано, так и остаётся?
1
о_О_Кто_здесь
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 минуту
Да, они остаются неизменными! т.к. все это уже конечные данные.
Тупо выводим все по очереди. Каждый новый вывод очищается экран. И создается эффект, что программа по шагово считает матрицу.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:44 #6
Читаете по строке и выводите на экран, и что не так?
Что значит:
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
но не как мне нужно.
Как это выглядит (из скринов не понял)?
1
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 22:47  [ТС] #7
Читается 1 строка, а как дальше выводить??? Как делать шаг назад?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:49 #8
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Как делать шаг назад?
Назад? Опять первую читать? Или вторую?
1
о_О_Кто_здесь
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;
}

Нет не сразу, прочитали первую, перешли на вторую, третью, и после второй уже крутить назад.
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
если еще раз тоже действие, то читается и вторая строка, но как сделать это на кнопках??
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 23:00 #11
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
но как сделать это на кнопках??
Про какие кнопки речь?
1
о_О_Кто_здесь
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(); //предыдущий шаг

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

Добавлено через 1 минуту
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Нажимаем ">" очистился экран, и появилась следующая из файла и т.д.
Соответственно "<" обратный эффект.
Но пока это только надписи, как реализовать точно не знаю(
NextStep(); // следующий шаг,
PreviousStep(); //предыдущий шаг
Тут, типо счетчик какой нить крутить... ++ --
Лучше сделать структуры, считвывать весь файл в массив (вектор) структур, а потом крутите, как хотите.
1
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
05.04.2014, 23:26  [ТС] #14
По одной строке ( 1 строка, 1 матрица).
Можно в вектор, но вся матрица сделана массивами, тогда препод скажет, делай или все в массивах или в векторах. Я начал делать в векторах, но почему-то все пошло не так.
И я сделал как мне проще...
В векторе и правда будет легче.
Вот по поводу игнора подумать, типо ignore(X,"\n") x- раз пропустить, или это работает только с символами?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 23:58 #15
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
или это работает только с символами?
У вас в файле, разве, что-то другое?
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 23:58
Привет! Вот еще темы с ответами:

чтение из файла - C++
Задача состоит в том,чтобы считать данные из файла,который содержит только целые числа со знаком,записать их в массив и вывести в консоль. ...

Чтение файла - C++
Доброго времени суток. Пишу программу которая может читать каждый символ файла. #include&lt;iostream&gt; #include&lt;fstream&gt; ...

Чтение из файла - C++
Помогите разобраться! Вопрос такой - как читать файл. Я новичок в программировании, прошу сильно не бить. Вот что надумал: #include...

Чтение из файла С++ - C++
Прочитать из txt файла данные, так чтобы пропустить первые 16 и и вывести на экран 3 столбца: Latitude, longitude, depth и затем сохранить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.04.2014, 23:58
Ответ Создать тему
Опции темы

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