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

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

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

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

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



Буду Очень благодарен за совет.
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++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 20:05  [ТС] #31
По поводу возврата, я пытался сохранить текущую позицию как вы говорили, и вернуться к этой позиции с помощью:
C++
1
in.seekg(pos);
Но не выходит, проблемы видимо, с сохранением позиции?
C++
1
2
3
//p = in.tellg();
//pos = in.tellg();
pos = in.tellg() / sizeof(???); //как только не пробовал
Возможно, нужно сначала из файла куда либо загрузить? Но это конечно столько действий вышло.
Я уже подумываю переделывать весь проект в вектор векторов....
Но там у меня больше проблем возникнет, а так же куча вопросов.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 20:16 #32
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Далее строчка игнорится
Зачем? Вы же этим пропускаете вторую строчку. И всё для того, чтобы потом сделать возврат для чтения этой второй строки?

Добавлено через 3 минуты
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
НО как при вводе "<" вернутся назад?
Назад - куда? Я и в прошлых постах не получил ответа на этот вопрос. После чтения очередной, вернуться к чтению следующей?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 20:20  [ТС] #33
alsav22, Разве? Помойму все все строки выводит на экран. Или я невнимателен.

Добавлено через 1 минуту
alsav22, Я читаю 1,2,3. И при наше назад, хочу вернутся с текущей на прошлую. Т.е. сейчас на 3 шаг, значит вернемся на второй.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 20:21 #34
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
alsav22, Разве? Помойму все все строки выводит на экран. Или я невнимателен.
Вот на это ответьте:
Цитата Сообщение от alsav22 Посмотреть сообщение
После чтения очередной, вернуться к чтению следующей?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 20:26  [ТС] #35
Цитата Сообщение от alsav22 Посмотреть сообщение
Сообщение от alsav22
После чтения очередной, вернуться к чтению следующей?
В смысле очередной???

Читаем 2 вторую строчку(матрицу), взбрело в голову "хочу глянуть прошлый шаг(как выглядела матрица до преобразования)" нажали назад, вывелось то что на экране было до этого.
А если вернулись на прошлый шаг, то после него при нажатии вперед, от него показывается следующий шаг по очередности после него.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 20:37 #36
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
В смысле очередной???
Очередная - это та, которая была прочитана последней (при очередном нажатии вперёд).

Добавлено через 4 минуты
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Читаем 2 вторую строчку(матрицу), взбрело в голову "хочу глянуть прошлый шаг(как выглядела матрица до преобразования)" нажали назад, вывелось то что на экране было до этого.
А если вернулись на прошлый шаг, то после него при нажатии вперед, от него показывается следующий шаг по очередности после него.
То есть, если возврат, то только на один шаг (а не в произвольное место), а когда, после этого, вперёд, то продолжить чтение с прерванного места? Например, прочли и вывели третью. Шаг назад - это чтение и вывод второй. После этого, шаг вперёд - это чтение и вывод четвёртой. Так?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 20:38  [ТС] #37
Цитата Сообщение от alsav22 Посмотреть сообщение
Сообщение от о_О_Кто_здесь
В смысле очередной???
немного я не понимаю вас.

Имеется ввиду так? :

1-шаг 2-шаг 3-шаг 4-шаг 5-шаг.....

Сейчас я, допустим, на 3 шаге.

очередная (последняя прочитанная) это 2 шаг.

После возврата на шаг два, вернутся при нажатии на > - вперед на 3 шаг, при < - назад, вернутся на 1 шаг.
я могу в скайпе позвонить, если нужно и можно.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 20:44 #38
Вот это правильно описано?
Цитата Сообщение от alsav22 Посмотреть сообщение
Например, прочли и вывели третью. Шаг назад - это чтение и вывод второй. После этого, шаг вперёд - это чтение и вывод четвёртой.
Если нет исправьте, именно, в этом тексте.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 20:47  [ТС] #39
Цитата Сообщение от alsav22 Посмотреть сообщение
Сообщение от alsav22
Например, прочли и вывели третью. Шаг назад - это чтение и вывод второй. После этого, шаг вперёд - это чтение и вывод ТРЕТЬЕЙ.
Исправил! Не четвертой, а третьей. Т.е. повторно проходим этот шаг.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 20:52 #40
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Т.е. повторно проходим этот шаг
Зачем повтор?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
06.04.2014, 20:59  [ТС] #41
alsav22, Четно говоря, не задавался вопросом, делаю по примеру курсовую работу.

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

По словам препода, нужно крутить программу, вперед назад, с любого момента. (соответственно кроме начала, где еще некуда возвращаться и конца, где некуда уже идти вперед). Типо пользователь будет смотреть что и где изменилось в данных, понимая что происходит и как вообще решается задача.
Я это же буду показывать и защищать перед комиссией. (ужас какой на первом курсе). Если подумать об этом, то повтор шага, будет плюсом мне - Демонстрировать программу, т.е. в строка N изменилась в шаге два, если вдруг упустили что-то, вернулись еще раз показали.... Уже сам запутался во всем этом.
alsav22
5417 / 4813 / 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
5417 / 4813 / 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:38
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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