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

📄 fileclasses.cpp

📁 agentspark 机器人模拟代码 适用robocup 机器人步态模拟仿真(机器人动作在NAOGETUP.cpp下修改)
💻 CPP
字号:
/* -*- mode: c++ -*-
   
   this file is part of rcssserver3D
   Fri May 9 2003
   Copyright (C) 2003 Koblenz University
   $Id: fileclasses.cpp,v 1.1.2.1 2007/02/13 19:42:14 rollmark Exp $

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.
  
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include "fileclasses.h"
#include <cstring>

namespace salt
{
/*static long fsize(FILE *f)
{
	long savepos, end;
	
	savepos = ftell(f);
	fseek(f, 0, SEEK_END);
	end = ftell(f);
	fseek(f, savepos, SEEK_SET);
	
	return end;
}*/
}

using namespace salt;


//------------------------------------------------------------------------------------------------
// MemFile
//------------------------------------------------------------------------------------------------

MemFile::MemFile(const char *fn, char *mode)
{
	if(fn==NULL)
	{
		mHandle		= NULL;
		mCharHandle	= NULL;
		mSize		= 0;
		mPosition	= 0;
	}
	else
	{
		Open(fn, mode);
	}
}

MemFile::MemFile(FILE *f)
{
  fseek(f,0,SEEK_END);
  mSize = ftell(f);
  rewind(f);

	mHandle		= new unsigned char[mSize];
	mCharHandle	= (unsigned char*)mHandle;
	mPosition	= 0;
	fread(mHandle,1,mSize,f);
}

MemFile::MemFile(RFile *f)
{
	mSize=f->Size();
	mHandle=new unsigned char[mSize];
	mCharHandle=(unsigned char*)mHandle;
	f->Read(mHandle,mSize);
	mPosition=0;
}

MemFile::~MemFile()
{
	if(mHandle!=NULL)
		Destroy();
}

bool MemFile::Open(const char *fn, char *mode)
{
	if(fn==NULL)
		return false;
	else
	{
		StdFile* f = new StdFile(fn, mode);
		if(f->GetHandle())
		{
			mSize		= f->Size();
			mCharHandle	= new unsigned char[mSize];
			mHandle		= mCharHandle;
			mPosition	= 0;
			f->Read(mHandle, mSize);
			delete f;
			return true;
		}
		else
		{
			delete f;
			return false;
		}
	}
}

bool MemFile::Open(void *buffer, long s)
{
	mHandle		= buffer;
	mCharHandle	= (unsigned char*)mHandle;
	mSize		= s;
	mPosition	= 0;
	return true;
}

void MemFile::Close()
{
	Destroy();
}

void MemFile::Destroy()
{
	if(mHandle!=NULL)
	{
	  delete mCharHandle;
		mHandle		= NULL;
		mCharHandle	= NULL;
		mSize		= 0;
		mPosition	= 0;
	}
}

int MemFile::Eof()
{
	return (mPosition>=mSize);
}

long MemFile::Tell()
{
	return mPosition;
}

int MemFile::GetPos(long *pos)
{
	*pos=Tell();
	return 1;
}

int MemFile::Seek(long offset, int origin)
{
	switch(origin){
		case SEEK_SET:
			return (mPosition=offset);
			break;
		case SEEK_END:
			return (mPosition=mSize-1-offset);
			break;
		default:
			return (mPosition+=offset);
			break;
	}
}

void MemFile::Rewind()
{
	mPosition=0;
}

long MemFile::Size()
{
	return mSize;
}

char* MemFile::Gets(char* buffer, int n)
{
	int i		= 0;
	bool done	= false;

	if(Eof()) return NULL;

	while(!done)
	{
		buffer[i]=mCharHandle[mPosition];
		mPosition++;
		i++;
		if((i==n)||(buffer[i-1]=='\n')||(Eof())) done=true;
	}
	buffer[i]=0;
	return buffer;
}

int MemFile::Getc()
{
	mPosition++;
	if((mPosition-1)>=mSize)
		return EOF;
	else
		return (int)(mCharHandle[(mPosition-1)]);
}

size_t MemFile::Read(void *buffer, size_t size, size_t count)
{
	long oldPos = mPosition;

	mPosition += static_cast<long>(size*count);
	if(mPosition >= mSize)
	{
		memcpy(buffer, &mCharHandle[oldPos], (mSize-oldPos));
		return (mSize-oldPos);
	}
	else
	{
		memcpy(buffer, &mCharHandle[oldPos], size*count);
		return (count);
	}
}

//------------------------------------------------------------------------------------------------
// StdFile
//------------------------------------------------------------------------------------------------

StdFile::StdFile(FILE* h)
{
	//Make sure object is free
	Destroy();
	//Assign new mHandle
	mHandle=h;
}

StdFile::StdFile(const char* fn,char* mode)
{
	mHandle=NULL;
	//open file
	Open(fn,mode);
}

StdFile::~StdFile()
{
	//Free up memory
	Destroy();
}

void StdFile::Destroy()
{
	//Close file
	Close();
}

void StdFile::Close()
{
	//Close file
	if(mHandle!=NULL)
		fclose((FILE*)mHandle);

	mHandle = NULL;
}

bool StdFile::Open(const char* fileName,char* mode)
{
	//Open fn with mode mode
	if(fileName==NULL)
		return false;
	else
	{
		mHandle=fopen(fileName, mode);
		if(mHandle==NULL)
			return false;
		else
			return true;
	}
}

int StdFile::Eof()
{
	return feof((FILE*)mHandle);
}

long StdFile::Tell()
{
	return ftell((FILE*)mHandle);
}

long StdFile::Size()
{
  long pos = ftell((FILE*)mHandle);
  fseek((FILE*)mHandle,0,SEEK_END);
  long size = ftell((FILE*)mHandle);
  fseek((FILE*)mHandle,pos,SEEK_SET);
return size;
}

int StdFile::GetPos(long* /*pos*/)
{
  return ftell((FILE*)mHandle);
}

void StdFile::Rewind()
{
	rewind((FILE*)mHandle);
}

char* StdFile::Gets(char* buffer, int n)
{
	return fgets(buffer, n, (FILE*)mHandle);
}

int StdFile::Getc()
{
	return fgetc((FILE*)mHandle);
}

int StdFile::Puts(const char*s)
{
	return fputs(s, (FILE*)mHandle);
}

int StdFile::Putc(int c)
{
	return fputc(c, (FILE*)mHandle);
}

int StdFile::Seek(long offset, int origin)
{
	return fseek((FILE*)mHandle, offset, origin);
}

size_t StdFile::Read(void *buffer,size_t mSize,size_t count)
{
	return fread(buffer, mSize, count, (FILE*)mHandle);
} 

size_t StdFile::Write(void *buffer,size_t mSize,size_t count)
{
	return fwrite(buffer, mSize, count, (FILE*)mHandle);
}

void* StdFile::GetHandle()
{
	return (void*) mHandle;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -