VC++ 2005 - Stream – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

VC++ 2005 - Stream – C / C++ – Fórum – Programujte.comVC++ 2005 - Stream – C / C++ – Fórum – Programujte.com

 

Matěj Pácha0
Super člen
24. 7. 2006   #1
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
Peter D.0
Expert
25. 7. 2006   #2
-
0
-

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:

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Jura_0
Stálý člen
25. 7. 2006   #3
-
0
-

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..)

Nahlásit jako SPAM
IP: ...–
Matěj Pácha0
Super člen
25. 7. 2006   #4
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
DeaLer+2
Hero
25. 7. 2006   #5
-
0
-

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áš.

Nahlásit jako SPAM
IP: ...–
Dušan Janošík | web: djanosik.cz, @djanosik
Matěj Pácha0
Super člen
26. 7. 2006   #6
-
0
-

Díky, až bude chvilka času, mrknu na to....

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
DeaLer+2
Hero
28. 7. 2006   #7
-
0
-

Ještě jedna maličkost. Za normálních okolností použij k práci s MemoryStreamem třídy StreamReader a StreamWriter.

Nahlásit jako SPAM
IP: ...–
Dušan Janošík | web: djanosik.cz, @djanosik
Matěj Pácha0
Super člen
29. 7. 2006   #8
-
0
-

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...

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Stream — založil daneka

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

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý