Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
2008kedr2008
3 / 3 / 2
Регистрация: 16.11.2010
Сообщений: 165
1

Как считать матрицу из файла в двумерный вектор

27.10.2012, 14:20. Просмотров 2798. Ответов 19
Метки нет (Все метки)

Доброго времени суток, начал писать шифр Скитала И столкнулся с такой проблемой, но могу считать матриwe размером 4х4 в двумерный вектор из файла! подскажите как реализовать! Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 14:20
Ответы с готовыми решениями:

ifstream (считать матрицу из файла в двумерный вектор)
нужно из файла считать матрицу в двумерный вектор. файл выглядит так: 2 9 6 5...

Как считать вектор из файла?
как считать вектор из файла?

Как считать в двумерный массив из файла?
массив 67 8 23 45 12 1 56 2 const int n = 2; const int m = 6; int...

Считать вектор из файла, записать вектор в файл
Доброго времени суток. Программа должна считывать числа из заданного файла,...

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

19
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 14:31 2
Как задаете двумерный вектор в программе и как матрица выглядит в файле?
0
Vourhey
Почетный модератор
6492 / 2267 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
27.10.2012, 14:47 3
C++
1
2
3
4
5
6
7
8
    std::vector<std::vector<int>> v;
    std::vector<int> tmp(4);
    std::ifstream f(L"1.txt");
    while(!f.eof())
    {
        std::copy_n(std::istream_iterator<int>(f), 4, tmp.begin());
        v.push_back(tmp);
    }
Числа в файле через пробел. Построчно:
1 2 3 4
5 6 7 67
12 3 1 23
45 2 3 1
Добавлено через 6 минут
Или как-нибудь так:
C++
1
2
3
4
5
6
7
    std::vector<std::vector<int>> v;
    std::ifstream f(L"D:\\tmp\\1.txt");
    while(!f.eof())
    {
        v.push_back(std::vector<int>(4));
        std::copy_n(std::istream_iterator<int>(f), 4, v.back().begin());
    }
1
2008kedr2008
3 / 3 / 2
Регистрация: 16.11.2010
Сообщений: 165
27.10.2012, 15:18  [ТС] 4
Спасибо, разобрался! Помогли!
0
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
09.11.2012, 17:06 5
Цитата Сообщение от Vourhey Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
    std::vector<std::vector<int>> v;
    std::vector<int> tmp(4);
    std::ifstream f(L"1.txt");
    while(!f.eof())
    {
        std::copy_n(std::istream_iterator<int>(f), 4, tmp.begin());
        v.push_back(tmp);
    }
Числа в файле через пробел. Построчно:


Добавлено через 6 минут
Или как-нибудь так:
C++
1
2
3
4
5
6
7
    std::vector<std::vector<int>> v;
    std::ifstream f(L"D:\\tmp\\1.txt");
    while(!f.eof())
    {
        v.push_back(std::vector<int>(4));
        std::copy_n(std::istream_iterator<int>(f), 4, v.back().begin());
    }
в обоих вариантах одни и те же ошибки

Код
Ошибка	1	error C2782: ::std::_Enable_if<!std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::copy(_InIt,_InIt,_OutIt): в шаблон параметр "_InIt" неоднозначен	c:\users\123\desktop\achtung\tokb\matrix\matrix\main.cpp	15	matrix
Ошибка	2	error C2782: _OutElem *std::copy(_InIt,_InIt,_OutElem (&)[_Size]): в шаблон параметр "_InIt" неоднозначен	c:\users\123\desktop\achtung\tokb\matrix\matrix\main.cpp	15	matrix
Ошибка	3	error C2782: ::std::_Enable_if<std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::copy(_InIt,_InIt,_OutIt): в шаблон параметр "_InIt" неоднозначен	c:\users\123\desktop\achtung\tokb\matrix\matrix\main.cpp	15	matrix
+ copy_n не определен, его на просто copy можно заменять?
0
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.11.2012, 17:15 6
C++
1
#include <algorithm>
сделали?
если не помогло, то у вас нет такого стандартного метода
0
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
09.11.2012, 17:16 7
алгоритм инклюдил, все равно.
0
Vourhey
Почетный модератор
6492 / 2267 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
09.11.2012, 17:20 8
Цитата Сообщение от Tiva Посмотреть сообщение
его на просто copy можно заменять?
copy не принимает кол-во элементов. Поэтому в данном примере - нет, будет ошибка компиляции.
0
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
09.11.2012, 21:30 9
Цитата Сообщение от Vourhey Посмотреть сообщение
copy не принимает кол-во элементов. Поэтому в данном примере - нет, будет ошибка компиляции.
как тогда быть?
0
Vourhey
Почетный модератор
6492 / 2267 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
09.11.2012, 21:31 10
Цитата Сообщение от Tiva Посмотреть сообщение
как тогда быть?
Писать другой код.
0
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
09.11.2012, 21:36 11
C++
1
2
3
4
5
6
7
8
9
10
void Matrix::SaveMatrix()
{
    ofstream ofst(FNAME_MATRIX);
    matrix_iterator iterlvl2;
        vector< int >::iterator iterlvl1;
        for (iterlvl2=v.begin();iterlvl2 != v.end();iterlvl2++) {
            iterlvl1 = (*iterlvl2).begin();
            ofst<<(*iterlvl2)<<" "; 
        }
}
по аналогу с добавлением\удалением сделал, но не принимает вижуалка...
0
Vourhey
Почетный модератор
6492 / 2267 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
09.11.2012, 21:42 12

Не по теме:

Tiva, как то, что ты написал относится к теме, в которой ты это пишешь?



Добавлено через 2 минуты
Tiva, и вообще, как вывести матрицу в аутпутстрим я уже писал в другой теме тебе же. Хватит здесь оффтопить.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
09.11.2012, 22:13 13
2008kedr2008, так попробуй:
C++
1
2
3
4
5
6
7
8
9
10
std::ifstream ifs("filename");
std::size_t const n = 4;
std::vector<std::vector<int> > matrix;
matrix.reserve(n);   
   
std::string line;
for (std::size_t i = 0; (i != n) && std::getline(ifs, line); ++i) {
   std::istringstream iss(line);
   matrix.push_back(std::vector<int>(std::istream_iterator<int>(iss), std::istream_iterator<int>()));
}
Добавлено через 17 минут
Хотя глупость написал
C++
1
2
3
4
5
6
7
8
std::ifstream ifs("filename");
std::vector<std::vector<int> > matrix(4, std::vector<int>(4));
 
for (std::size_t i = 0; i != matrix.size(); ++i) {
   for (std::size_t j = 0; j != matrix[i].size(); ++j) {
      ifs >> matrix[i][j];
   }
}
1
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
12.11.2012, 15:20 14
Цитата Сообщение от gray_fox Посмотреть сообщение
2008kedr2008, так попробуй:
C++
1
2
3
4
5
6
7
8
9
10
std::ifstream ifs("filename");
std::size_t const n = 4;
std::vector<std::vector<int> > matrix;
matrix.reserve(n);   
   
std::string line;
for (std::size_t i = 0; (i != n) && std::getline(ifs, line); ++i) {
   std::istringstream iss(line);
   matrix.push_back(std::vector<int>(std::istream_iterator<int>(iss), std::istream_iterator<int>()));
}
Добавлено через 17 минут
Хотя глупость написал
C++
1
2
3
4
5
6
7
8
std::ifstream ifs("filename");
std::vector<std::vector<int> > matrix(4, std::vector<int>(4));
 
for (std::size_t i = 0; i != matrix.size(); ++i) {
   for (std::size_t j = 0; j != matrix[i].size(); ++j) {
      ifs >> matrix[i][j];
   }
}
вот мой пример(ваш не подходит, т.к. вектор изначально пустой, и кол-во элементов в файле не известно и надо пушбечить)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Matrix::LoadMatrix()
{
    
    ifstream ifst(FNAME_MATRIX);
    while(!ifst.eof())
    {
                int temp;
 
                ifst >> temp;
        matrix_iterator iterlvl2;
        vector< int >::iterator iterlvl1;
        for (iterlvl2=v.begin();iterlvl2 != v.end();iterlvl2++) 
        {
            iterlvl1 = (*iterlvl2).begin();
            (*iterlvl2).push_back(temp);
        }
    }
}
только он считывает весь файл в одну строку, а не так, как он хранится в файле. помогите.
0
Vourhey
Почетный модератор
6492 / 2267 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
12.11.2012, 15:31 15
Tiva, что тебе мешает читать построчно?
0
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
12.11.2012, 16:32 16
Цитата Сообщение от Vourhey Посмотреть сообщение
Tiva, что тебе мешает читать построчно?
а как потом строку разбивать на цисла и записывать их "построчно" в вектор? у меня опять получается что все записывается в одну строку вектора.
0
Vourhey
Почетный модератор
6492 / 2267 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
12.11.2012, 17:18 17
Цитата Сообщение от Tiva Посмотреть сообщение
а как потом строку разбивать на цисла и записывать их "построчно" в вектор?
Блин, что ты выдумываешь сложности там, где их нет? Зачем тебе знать о "построчно", когда ты уже строку считал одну? Вот текстом, если написать, то логика в общем виде такая:
пока не конец файла
{
создаем новый вложенный вектор
читаем строку
разбиваем строку по пробелам (пробел как разделитель) - алгоритм любой
забиваем значения во вложенный вектор
}
Уже в одну строчку не получится. Потому что на каждой итерации следующая строка пойдет в новый вложенный вектор.
0
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
13.11.2012, 13:21 18
Цитата Сообщение от Vourhey Посмотреть сообщение
пока не конец файла
{
создаем новый вложенный вектор
читаем строку
разбиваем строку по пробелам (пробел как разделитель) - алгоритм любой
забиваем значения во вложенный вектор
}
что за вложенный вектор? вектор вектора?
и как это делить и каким алгоритмом, и как это потом забивать я и не могу понять. у меня тупо все в одну строчку вектора записыватся.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
13.11.2012, 13:49 19
C++
1
2
3
4
5
std::string line;
while (std::getline(ifs, line)) {
   std::istringstream iss(line);
   matrix.push_back(std::vector<int>(std::istream_iterator<int>(iss), std::istream_iterator<int>()));
}
0
Vourhey
Почетный модератор
6492 / 2267 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
13.11.2012, 16:30 20
Цитата Сообщение от Tiva Посмотреть сообщение
что за вложенный вектор? вектор вектора?
Это ты меня спрашиваешь? Это тебе писать надо, ты сам должен знать, что там у тебя. В этой теме вообще-то именно двумерный вектор обсуждается.
Цитата Сообщение от Tiva Посмотреть сообщение
и как это делить и каким алгоритмом
Если ты не знаешь стандартного алгоритма, то напиши свой руками.
Цитата Сообщение от Tiva Посмотреть сообщение
и как это потом забивать я и не могу понять
push_back'ом, как и всегда.
0
13.11.2012, 16:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 16:30

Как считать матрицу 3*3 из файла если он там задан неправильно
как считать матрицу 3*3 из файла если он там задан неправильно например в...

Как считать из файла текст в двумерный массив типа char и отсортировать в алф. порядке?
Постановка задачи: Исходные данные считать из текстового файла через отдельную...

Считать посимфольно из файла в char вектор
Например в файле записаны: aaaaaaa bbbbbbb надо считать первую строчку в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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