Možná vám budu připadat jako úplná lama, ale co se dá dělat. Potřeboval bych ukládat pole polí (velkou tabulku, dvourozměrné pole) do paměti (do souboru je to pomalí). V MSDN jsem si našel pár příkladů na práci se streamem, ale většina je textová a ještěk tomu v RichTextBoxu, což se mi vůbec nehodí. Pokud s tím máte někdo zkušenosti, poraďte mi prosím jak načtení a zápis položek. Nechci databázi, chci prostou tabulku. Díky
Fórum › C / C++
VC++ 2005 - Stream
neviem ci ti to pomoze, ale ked som nacitaval a zapisoval do suboru velky objem dat (po malych castiach) tak mi celkom výrazne pomohol <stdio.h> namiesto <fstream>. :toto:
paashi napsal:
Možná vám budu připadat jako úplná lama, ale co se dá dělat. potřeboval bych ukládat pole polí (velkou tabulku, dvourozměrné pole) do paměti (do souboru je to pomalé). V MSDN jsem si našel pár příkladů na práci se streamem, ale většina je textová a ještě k tomu v RichTextBoxu, což se mi vůbec nehodí. Pokud s tím máte někdo zkušenosti, poraďte mi prosím jak na čtení a zápis položek. Nechci databázi, chci prostou tabulku. Díky
Sice jsi nenapsal, kolik znamena velka tabulka, ale presto muzes pouzit konstrukci:
vector<vector<Tvuj_typ> > paashisBigTable;
...
paashisBigTable[0][0] = hodnota;
....
Nebo podle me lepsi reseni nacpat to do jednorozmerneho pole a prepocitavat indexy:
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
class paashiContainer: public std::vector<T>
{
public:
typedef typename std::vector<T>::size_type size_type;
typedef typename std::vector<T>::reference reference;
typedef typename std::vector<T>::const_reference const_reference;
paashiContainer() : std::vector<T>(), m_cols(0), m_rows(0) {}
paashiContainer(size_type Rows, size_type Cols):
std::vector<T>(Rows*Cols), m_cols(Cols), m_rows(Rows) {}
inline int getRows() const {return m_rows;}
inline int getCols() const {return m_cols;}
reference operator()(size_type Row, size_type Col) { return (*this)[Row*m_cols+Col];}
const_reference operator()(size_type Row, size_type Col) const { return (*this)[Row*m_cols+Col];}
private:
size_type m_cols, m_rows;
};
int main(int argc, char *argv[])
{
paashiContainer<int> pC(3,5);
for(int i=0; i < pC.getRows(); ++i)
for(int j=0; j < pC.getCols(); ++j)
pC(i,j) = (int)(i==j);
for(int i=0; i < pC.getRows(); ++i){
for(int j=0; j < pC.getCols(); ++j)
cout << pC(i,j) << " ";
cout << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
?
Asi sis vsiml, ze k pristupu k jednotlivym bunkam pres () a ne, jak jsi patrne zvykly pres [][], ale to vubec nevadi. Jinak je to sablona, cili muzes uchovavavat cokoliv budes chtit, jen pod jednou podminkou pokud budes chtit uchovavat ukazatele na objekty je potreba tridu patricne upravit(kopykonstruktor, operator prirazeni..)
Re: stdio.h:
I?ll check it.
Re: vector:
D?ky za vy?erp?vaj?c? radu. STL jsem cht?l vyzkou?et, ale stejn? mi furt vrt? hlavou, jak sakra pracovat se System::IO::Stream. Mo?n? bych se m?l po??dn? nau?it C++, ale tak n?jak mi p?ipad?, ?e to ve VC++ mus? j?t jednodu?e (kdy? u? si hraju s takovejma kravinama, jak vykreslovat grafy).
Jinak moje tabulka ??sel typu double m? od 2 do 10 sloupc? a od 1000 do 1 000 000 ??dk? (jak kdy, ale m??u to zjistit p?ed jej?m vytvo?en?m). Kdy? jsem to ukl?dal do souboru, m?lo to okolo 20 MB maxim?ln?, tak?e do RAMky by se to vej?t m?lo.
Ukládání informací do paměti je ve své podstatě jednoduchá věc, ale je nutné použít object MemoryStream. V tvém případě bych ale doporučoval serializaci objektu.
Příklad v C# (snad to nebude velký problém):
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApplication1
{
class Program
{
// vytvoření instance streamu
static MemoryStream stream = new MemoryStream();
static void Main(string[] args)
{
// vytvoření dvourozměrného pole
int[,] pole = new int[5, 5];
// vložení určité hodnoty
pole[0, 1] = Convert.ToInt32(Console.ReadLine());
// serializace objektu
Serialize(pole);
// deserializace objektu a vypsání výše vložené hodnoty
Console.WriteLine(((int[,])Deserialize())[0, 1].ToString());
}
static void Serialize(Object obj)
{
BinaryFormatter b = new BinaryFormatter();
b.Serialize(stream, obj);
}
static object Deserialize()
{
// bez této části by pravděpodobně nebylo možné deserializovat objekt
byte[] buffer = stream.GetBuffer();
stream.Dispose();
// opětovné vytvoření streamu
stream = new MemoryStream(buffer);
BinaryFormatter b = new BinaryFormatter();
return b.Deserialize(stream);
}
}
}
Záměrně jsem nepoužil vlastnosti generiky, protože nevím, jak na tom C++/CLI je s podporou této technologie.
Případné další informace o serializaci objektů už si jistě rád dohledáš.
Díky, až bude chvilka času, mrknu na to....
Ještě jedna maličkost. Za normálních okolností použij k práci s MemoryStreamem třídy StreamReader a StreamWriter.
Nevím proč, ale nějak mi to nebere stream.Dispose(), ačkoliv po napsání tečky se mi rozbalí nabídka členů, ze které Enterem vyberu Dispose(). Vypisuje to, že Dispose() není členskou funkcí MemoryStream - docela si to protiřečí. Ale i tak díky. Prostě to musím přemluvit...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Stream reader c# — založil Martin
Horizontální menu na stream.cz/ — založil cheeester
Online stream z kamery — založil porast
Webkamery v C# - live stream — založil milikiller
Moderátoři diskuze