Ukládání a načítání dat z disku s pomocí memcpy a vektoru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukládání a načítání dat z disku s pomocí memcpy a vektoru – C / C++ – Fórum – Programujte.comUkládání a načítání dat z disku s pomocí memcpy a vektoru – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
MiCizek0
Stálý člen
26. 4. 2016   #1
-
0
-

 Ahoj, testuju memcpy tak, že jakýkoliv vektor se pokusím uložit do vektoru s hodnotami char a ten zapíšu na disk a nakonec načtu data z disku do vectoru s char hodnotami a jeho data načtu do jakéhokoliv vektoru. Chtěl bych takhle načítat a ukládat data z disku přímo bez toho, abych algoritmus zpomaloval pomocí for syntaxe. Akorát to nefunguje podle představ a načte to špatně.

struct Float4
{
	float x;
	float y;
	float z;
	float w;
}

class CImage
{
public:

	void LoadFile(const std::wstring& filename)
	{
		std::ifstream fin(filename, std::ios::binary);

		fin.seekg(0, std::ios_base::end);
		int size = (int)fin.tellg();
		fin.seekg(0, std::ios_base::beg);
		std::vector<char> data(size);


		/*mHeight = 256;
		mWidth = 256;
		mSize = mHeight * mWidth;*/

		fin.read(&data[0], size);

		mImage.resize(size / sizeof(Float4));
		memcpy(&mImage[0], &data[0], size);

		fin.close();
	}

	void SaveFile(const std::wstring& filename)
	{
		std::ofstream fout(filename);
		std::vector<char> data(mImage.size() * sizeof(Float4));

		memcpy(&data[0], &mImage[0], data.size());
		fout.write(&data[0], data.size());

		fout.close();
	}
private:
std::vector<Float4> mImage;
}
Nahlásit jako SPAM
IP: 109.81.215.–
Radek Chalupa
~ Redaktor
+1
Super člen
26. 4. 2016   #2
-
0
-

#1 MiCizek
Třetí parametr memcpy je v bytech, a size() je velikost vektoru v prvcích.

Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
Řešení
Radek Chalupa
~ Redaktor
+1
Super člen
27. 4. 2016   #3
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#1 MiCizek
PS: Jinak žádné memcpy nepotřebuješ, naopak je zbytečné vytvářet další "pomocný" vektor (psal jsi že jde o rychlost), prostě přímo zapíšeš/ načteš do/ze souboru ten vektor. Následující kód bez problémů funguje (pro souborové operace používám výhradně Win API funkce, dávají plnou kontrolu).

static const wchar_t* _jmeno_souboru = L"test.bin";

struct F4
{
	float f1;
	float f2;
	float f3;
	float f4;
};


void nacti()
{
	HANDLE hf = CreateFile(_jmeno_souboru, GENERIC_READ, 0, nullptr, OPEN_EXISTING, 0, nullptr);
	if (hf == INVALID_HANDLE_VALUE)
		return;
	DWORD size = GetFileSize(hf, nullptr);
	std::vector<F4> v(size/sizeof(F4));
	DWORD dw;
	ReadFile(hf, (void*)&v[0], size, &dw, nullptr);
	CloseHandle(hf);
	for (size_t i = 0; i < v.size(); i++)
	{
		wprintf(L"%f - %f - %f - %f\n", v[i].f1, v[i].f2, v[i].f3, v[i].f4);
	}
	getchar();
}

void zapis()
{
	F4 f;
	std::vector<F4> v;
	f.f1 = 1.123;
	f.f2 = 2.234;
	f.f3 = 3.456;
	f.f4 = 5.678;
	v.push_back(f);
	f.f1 = 9.87;
	f.f2 = 8.76;
	f.f3 = 7.65;
	f.f4 = 6.54;
	v.push_back(f);
	HANDLE hf = CreateFile(_jmeno_souboru, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, 0, nullptr);
	if (hf == INVALID_HANDLE_VALUE)
		return;
	DWORD dw;
	WriteFile(hf, (const void*)&v[0], v.size() * sizeof(F4), &dw, nullptr);
	CloseHandle(hf);
}

int main()
{
//	zapis();
	nacti();
	return 0;
}

Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
MiCizek0
Stálý člen
11. 5. 2016   #4
-
0
-

Ahoj děkuji. Myslím, že to řeší můj problém.

Nahlásit jako SPAM
IP: 83.208.68.–
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, 48 hostů

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ý