⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 punjacfajl.cpp

📁 pc loader for 8051 based microcomputers
💻 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 + -