3 / 3 / 2
Регистрация: 16.11.2010
Сообщений: 165
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток, начал писать шифр Скитала И столкнулся с такой проблемой, но могу считать матриwe размером 4х4 в двумерный вектор из файла! подскажите как реализовать! Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2012, 14:20
Ответы с готовыми решениями:

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

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

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

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

19
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 14:31 2
Как задаете двумерный вектор в программе и как матрица выглядит в файле?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
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
3 / 3 / 2
Регистрация: 16.11.2010
Сообщений: 165
27.10.2012, 15:18  [ТС] 4
Спасибо, разобрался! Помогли!
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
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
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.11.2012, 17:15 6
C++
1
#include <algorithm>
сделали?
если не помогло, то у вас нет такого стандартного метода
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
09.11.2012, 17:16 7
алгоритм инклюдил, все равно.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
09.11.2012, 17:20 8
Цитата Сообщение от Tiva Посмотреть сообщение
его на просто copy можно заменять?
copy не принимает кол-во элементов. Поэтому в данном примере - нет, будет ошибка компиляции.
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
09.11.2012, 21:30 9
Цитата Сообщение от Vourhey Посмотреть сообщение
copy не принимает кол-во элементов. Поэтому в данном примере - нет, будет ошибка компиляции.
как тогда быть?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
09.11.2012, 21:31 10
Цитата Сообщение от Tiva Посмотреть сообщение
как тогда быть?
Писать другой код.
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
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
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
09.11.2012, 21:42 12

Не по теме:

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



Добавлено через 2 минуты
Tiva, и вообще, как вывести матрицу в аутпутстрим я уже писал в другой теме тебе же. Хватит здесь оффтопить.
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
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
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
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
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
12.11.2012, 15:31 15
Tiva, что тебе мешает читать построчно?
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
12.11.2012, 16:32 16
Цитата Сообщение от Vourhey Посмотреть сообщение
Tiva, что тебе мешает читать построчно?
а как потом строку разбивать на цисла и записывать их "построчно" в вектор? у меня опять получается что все записывается в одну строку вектора.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
12.11.2012, 17:18 17
Цитата Сообщение от Tiva Посмотреть сообщение
а как потом строку разбивать на цисла и записывать их "построчно" в вектор?
Блин, что ты выдумываешь сложности там, где их нет? Зачем тебе знать о "построчно", когда ты уже строку считал одну? Вот текстом, если написать, то логика в общем виде такая:
пока не конец файла
{
создаем новый вложенный вектор
читаем строку
разбиваем строку по пробелам (пробел как разделитель) - алгоритм любой
забиваем значения во вложенный вектор
}
Уже в одну строчку не получится. Потому что на каждой итерации следующая строка пойдет в новый вложенный вектор.
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
13.11.2012, 13:21 18
Цитата Сообщение от Vourhey Посмотреть сообщение
пока не конец файла
{
создаем новый вложенный вектор
читаем строку
разбиваем строку по пробелам (пробел как разделитель) - алгоритм любой
забиваем значения во вложенный вектор
}
что за вложенный вектор? вектор вектора?
и как это делить и каким алгоритмом, и как это потом забивать я и не могу понять. у меня тупо все в одну строчку вектора записыватся.
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
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
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
13.11.2012, 16:30 20
Цитата Сообщение от Tiva Посмотреть сообщение
что за вложенный вектор? вектор вектора?
Это ты меня спрашиваешь? Это тебе писать надо, ты сам должен знать, что там у тебя. В этой теме вообще-то именно двумерный вектор обсуждается.
Цитата Сообщение от Tiva Посмотреть сообщение
и как это делить и каким алгоритмом
Если ты не знаешь стандартного алгоритма, то напиши свой руками.
Цитата Сообщение от Tiva Посмотреть сообщение
и как это потом забивать я и не могу понять
push_back'ом, как и всегда.
0
13.11.2012, 16:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2012, 16:30
Помогаю со студенческими работами здесь

Как считать данные с файла в двумерный массив?
В текстовом файле находится список студентов и год рождения, например: Фамилия Имя 1999...

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

Как считать матрицу 3*3 из файла если он там задан неправильно
как считать матрицу 3*3 из файла если он там задан неправильно например в файле 4 5 6 7 8 1 2 3...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru