Pakowanie plików za pomocą biblioteki fstream

0

Witam,
mam problem z dodawaniem plików do własnego formatu pliku. Plik powinien zwiększyć swój rozmiar o wielkość dodanego pliku, a jego rozmiar posiada zaledwie kilka kilobajtów. Chciałbym się dowiedzieć w którym miejscu robię błąd ?
Chyba najlepiej zaprezentuję mój problem za pomocą kodu.:D

#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>

int main()
{
HANDLE hFile = NULL;
std::string strFileName;
strFileName = "data.dat";

hFile = CreateFile(L"d.jpg", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		cout << "Blad ladowania\n";
		hFile = NULL;
	}
fstream file;
file.open(strFileName, fstream::in | fstream::out | fstream::app);
	if (!file.good())
	{
		cout << "Error\n";
	}
	else
	{
		file << hFile;
		cout << "Sukces\n";
		file.close();
	}

return 0;
}

 
0

zapomniałeś o ios::binary

0

To nic nie daje. Nadal jest to samo.

0

No to podaj pełny kod a nie jakieś urywki.

2

Użyję bibliotek C ale co mi tam :)

#include <cstdio>
#include <cstdlib>

int main(int, char**)
{
	unsigned char * pBufferD = 0;
	unsigned long ulSizeOfFileD;

	FILE * pFileD = fopen("d.jpg", "rb");
	if(pFileD)
	{
		fseek(pFileD, 0, SEEK_END);
		ulSizeOfFileD = ftell(pFileD);
		rewind(pFileD);
		if(ulSizeOfFileD)
		{
			pBufferD = new unsigned char[ulSizeOfFileD];
			if(fread(pBufferD, 1, ulSizeOfFileD, pFileD) != ulSizeOfFileD)
			{
				printf("Can not read file!\n");
				pBufferD = 0;
			}
		}
		fclose(pFileD);
	}
	else
		printf("Can not open input file!\n");

	if(pBufferD)
	{
		FILE * pFileOut = fopen("data.dat", "ab+");
		if(pFileOut)
		{
			fwrite(pBufferD, 1, ulSizeOfFileD, pFileOut);
			fclose(pFileOut);
			printf("Success!\n");
		}
		else
			printf("Can not open output file!\n");
		delete [] pBufferD;
	}
	return 0;
}
0

Nie mieszaj funkcji WinAPI CreateFile z klasą z biblioteki standardowej fstream.
To dwa różne sposoby operowania na plikach. Konkretnie takie coś nie ma prawa działać:

file << hFile;

Co tu zapisujesz do pliku? Wartość typu HANDLE, która jest zdefiniowana jako void*. Czyli zapisujesz jakiś wskaźnik, w dodatku nie wiadomo na co.
Klasa fstream zapisze do pliku zupełnie bezużyteczną wartość tego wskaźnika.

To w mam otworzyć plik za pomocą fstream::open(), ale potem jak go przekazać do zapisu?

Albo używasz fstream/ifstream/ofstream, albo CreateFile/WriteFile/ReadFile.

Co prawda nikt nie zabrania mieszania jednego i drugiego, ale wtedy trzeba wiedzieć co się robi, i spodziewać się, że operator << nie będzie działał dla typu HANDLE.

0
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
  {
   ifstream fin("d.jpg");
   ofstream fout("data.dat",ios::out|ios::app|ios::binary);
   const size_t size=256*1024;
   static char buff[size];
   for(size_t rd=size;rd>=size;fout.write(buff,rd=fin.gcount())) fin.read(buff,size);
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1