Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2012, 15:07   #1
Tiva
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 49
По умолчанию как заполнить двумерный вектор из файла?

сохранить в файл двумерный вектор у меня получилось.

как заполнить этот вектор из файла?
в файле:
Код:
126 0 0 4
2 4 0 0
0 0 0 0
кол-во элементов в файле не известно, но таблица из чисел там всегда прямоугольная(т.е. не будет что в одно строке 5 чисел а в другой 7)

вот что есть:
Код:
typedef vector<vector<int>>::iterator matrix_iterator;
class Matrix
{
public:
    vector<vector<int>> v;

    Matrix();
	friend bool FileExists(const string& path);
	void AddSubject();
	void AddObject();
	void DelSubject();
	void DelObject();
	void DelSubject(int n);
	void DelObject(int n);
	void PrintOut(ostream& OutStream);
	void SaveMatrix(int err);
	void LoadMatrix();
	void AddRightToObj(int sub, int obj, int right);
	void DelRightToObj(int sub, int obj, int right);
	void Command(int right);
	bool check(int right);
	//Matrix operator = (Matrix&);
};
void Matrix::SaveMatrix(int err) //если err=0 матрица не записывается. err используется чтоб не было бесконечной рекурсии
{
	if(!FileExists(FNAME_MATRIX) || err!=0)
	{
			ofstream ofst(FNAME_MATRIX);
			for(matrix_iterator it = v.begin(); it != v.end(); ++it)
			{
				copy(it->begin(), it->end(), ostream_iterator<int>(ofst, " "));
				ofst<<endl;
			}
			cout<<"Матрица сохранена\n";
	}
	else 
	{
		char ch;
		cout<<"Вы уверены, что хотите перезаписать матрицу?+ или -\n";
		cin>>ch;
		if(ch=='+') SaveMatrix(1);
		else cout<<"Матрица не сохранена\n";
	}
}
void Matrix::LoadMatrix()
{
	
	ifstream ifst(FNAME_MATRIX);
    while(!ifst.eof())
			{
				int temp;

				ifst >> temp;//считываем в временные переменные логин, пароль и уровень при запуске программы
				//следующие три строчки, заполняют пользовательские данные в поля класса.
				for(matrix_iterator it = v.begin(); it != v.end(); ++it)
				{
					it->push_back(temp);
				}
			}

}
так как есть, функция считывает все числа из файла, но на выводе получается чтоб он записывает не правильно
в файле
1 2 3
4 5 6
в мой вектор записывается 1 2 3 4 5 6
помогите пожалуйста!
Tiva вне форума Ответить с цитированием
Старый 12.11.2012, 19:33   #2
Tiva
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 49
По умолчанию

что, никто не знает? (((
Tiva вне форума Ответить с цитированием
Старый 12.11.2012, 19:46   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот смотри:
Код:
// dsfsd.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <vector>
#include <fstream>

using namespace std;
vector<vector<int>> v;

int _tmain(int argc, _TCHAR* argv[])
{
	
	int k=0;
			for(int i=0;i<10;i++){
             vector<int> v2;
			 for(int j=0;j<10;j++){
				 v2.push_back(k++);
 			 }
			 v.push_back(v2);
			}

// Пишем 	в бинарник
	ofstream ofst("d:\\1\\mat",ios::binary);
			for(vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
			{
             vector<int> v2=*it;
			 for(vector<int>::iterator it2 = v2.begin(); it2 != v2.end(); it2++)
			 {
				 int i=*it2;
                ofst.write((char*)&i,sizeof(i));
 			 }
			 v2.clear();
			}
			v.clear();
			ofst.close();

// Читаем из бинарника
	ifstream ifst("d:\\1\\mat",ios::binary);

			for(int i=0;i<10;i++){
             vector<int> v2;
			 for(int j=0;j<10;j++){
				 int i;
				 ifst.read((char*)&i,sizeof(i));
				 v2.push_back(i);
 			 }
			 v.push_back(v2);
			}

	return 0;
}
Идея понятна?
I'm learning to live...

Последний раз редактировалось Stilet; 12.11.2012 в 20:05.
Stilet вне форума Ответить с цитированием
Старый 14.11.2012, 15:47   #4
Tiva
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 49
По умолчанию

я думал что записывать структуру в бинарный файл, но я отмел этот вариант, т.к. преподаватель, на защите лабораторной, должен будет дать на вход свой файл матрицы, любым размером (хоть 234х172, да он у нас такой, и заранее предупреждал)

и не думаю, что он захочет сам перегонять свою матрицу в бинарный вид специально для моей программы.

плюс программа еще не до конца закончена, и её надо отлаживать, а для этого мне надо видеть реальнные значения элементов матрицы в файле

поэтому бинарный вариант не подходит
тема еще актуальна, помогите!
Tiva вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный вектор? jojahti Общие вопросы C/C++ 4 14.09.2012 15:00
Как из ini файла заполнить ComboBox? alexusankov Общие вопросы Delphi 10 05.01.2011 13:58
Как заполнить двумерный массив случайными числами? SkuLLL Помощь студентам 1 14.12.2010 17:04
Двумерный массив заполнить так... Natalya17 Паскаль, Turbo Pascal, PascalABC.NET 3 30.04.2010 11:39
Заполнить двумерный массив константами Lacoste Общие вопросы Delphi 4 15.02.2009 14:37