📄 punjacfajl.cpp
字号:
// PunjacFajl.cpp: implementation of the CPunjacFajl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PunjacFajl.h"
#include "Win32File.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPunjacFajl::CPunjacFajl(const std::string& nazivFajla)
: pFajl_m(new CFile())
, spoljniCFile_m(false)
, otvoriZatvori_m(true)
, nazivFajla_m(nazivFajla)
, preostaloBajtova_m(0)
{
}
CPunjacFajl::CPunjacFajl(CFile* pFajl)
: pFajl_m(pFajl)
, spoljniCFile_m(true)
, otvoriZatvori_m(false)
, preostaloBajtova_m(0)
{
std::string pomStr(LPCTSTR(pFajl->GetFileName()));
nazivFajla_m = pomStr;
}
CPunjacFajl::~CPunjacFajl()
{
if (!spoljniCFile_m) {
delete pFajl_m;
}
}
bool CPunjacFajl::Stop(std::string& opis)
{
// Ako nije potrebno zatvaranje fajla, ne radi nista
if (!otvoriZatvori_m) return true;
if (!ProveriFajlPtr(opis)) return false;
bool bOK = false;
std::string defaultOpis = "unknown error in Close";
try {
pFajl_m->Close();
bOK = true;
}
catch (CFileException* e) {
opis = CWin32File::ExceptionToTxt(*e, defaultOpis);
e->Delete();
}
catch (...) {
opis = defaultOpis;
}
return bOK;
}
bool CPunjacFajl::PripremiFajlZaCitanje(std::string& opis)
{
if (OtvoriFajlZaCitanje(opis)) {
if (DuzinaFajla(preostaloBajtova_m, opis)) {
return true;
}
}
return false;
}
bool CPunjacFajl::ProcitajBajt(BYTE& bajt)
{
if (preostaloBajtova_m > 0) {
const int BROJ_BAJTOVA = 1; // citam jedan bajt
BYTE buffer[BROJ_BAJTOVA]; // bafer za citanje
if (ProcitajBajtove(buffer, BROJ_BAJTOVA)){
bajt = buffer[0];
return true;
}
}
return false;
}
bool CPunjacFajl::ProcitajBajtove(BYTE* bafer, UINT brojBajtova)
{
if (brojBajtova == 0) return true;
if (preostaloBajtova_m > 0) {
try {
if (pFajl_m == 0) throw CPunjacException(TXT_NULL_PTR);
UINT procitanoBajtova = pFajl_m->Read(bafer, brojBajtova);
preostaloBajtova_m -= procitanoBajtova;
return (procitanoBajtova == brojBajtova);
}
catch (CFileException* e) {
std::string tekstGreske = CWin32File::ExceptionToTxt(*e, "CFileException");
e->Delete();
throw CPunjacException(tekstGreske);
}
catch (...) {
throw CPunjacException("unknown error in CPunjacFajl::ProcitajBajtove");
}
}
return false;
}
//////////////////////////////////////////////////////////////////////
// Pomocne funkcije
//////////////////////////////////////////////////////////////////////
bool CPunjacFajl::OtvoriFajlZaCitanje(std::string& opis)
{
// Ako nije potrebno otvaranje fajla, ne radi nista
if (!otvoriZatvori_m) return true;
if (!ProveriFajlPtr(opis)) return false;
bool bOK = false;
CFileException e;
if (pFajl_m->Open(nazivFajla_m.c_str(), CFile::modeRead, &e)) {
bOK = true;
}
else {
opis = CWin32File::ExceptionToTxt(e, "unknown error in Open");
}
return bOK;
}
bool CPunjacFajl::DuzinaFajla(DWORD& brojBajtova, std::string& opis)
{
if (!ProveriFajlPtr(opis)) return false;
const std::string defaultOpis = "unknown error in GetLength";
try {
brojBajtova = pFajl_m->GetLength();
return true;
}
catch (CFileException* e) {
opis = CWin32File::ExceptionToTxt(*e, defaultOpis);
e->Delete();
}
catch (...) {
opis = defaultOpis;
}
return false;
}
bool CPunjacFajl::ProveriFajlPtr(std::string& opis)
{
if (pFajl_m == 0){
opis = TXT_NULL_PTR;
return false;
}
return true;
}
// tekstovi
const std::string CPunjacFajl::TXT_NULL_PTR = "null file pointer";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -