一套比较实用的文件操作函数集

// FileOp.h

#ifndef _FILEOP_H_
#define _FILEOP_H_

#include <stdio.h>
#include <stdlib.h>

#ifndef SAFE_FREE
#define SAFE_FREE(p) if(p) { free(p); p = NULL; }
#endif

#ifdef __cplusplus
extern "C" {
#endif

//------------------------------------------------------------------------
//  FILE_OP_GetFileSize()   
//                      - 获取文件的长度
//  szFileName          - 文件名
//  pulFileSize         - 返回的文件的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_GetFileSize(const char* szFileName, unsigned long* pulFileSize);

//------------------------------------------------------------------------
//  FILE_OP_RetFileSize()   
//                      - 获取文件的长度
//  szFileName          - 文件名
//  函数返回值:文件的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_RetFileSize(const char* szFileName);

//------------------------------------------------------------------------
//  FILE_OP_ReadDataFromFile()   
//                      - 获取文件中指定长度的数据内容
//  szFileName          - 文件名
//  pbData              - 返回的数据内容
//  ulDataSize          - 数据的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_ReadDataFromFile(const char* szFileName, 
							 unsigned char* pbData, unsigned long ulDataSize);

//------------------------------------------------------------------------
//  FILE_OP_ReadAllDataFromFile()   
//                      - 获取文件中所有内容
//  szFileName          - 文件名
//------------------------------------------------------------------------
char* FILE_OP_ReadAllDataFromFile(const char* szFileName);

#define FLAG_SZ_END_WITH_ZERO 1
#define FLAG_SZ_END_WITHOUT_ZERO 0

//------------------------------------------------------------------------
//  FILE_OP_ReadAllDataFromFileEx()   
//                      - 获取文件中所有内容,并且可选择是否以'\0'结尾
//  szFileName          - 文件名
//  flag_sz             - 是否以'\0'结尾。0:否;1:是
//------------------------------------------------------------------------
char* FILE_OP_ReadAllDataFromFileEx(const char* szFileName, int flag_sz);

//------------------------------------------------------------------------
//  FILE_OP_WriteDataToFile()   
//                      - 保存数据到文件
//  szFileName          - 文件名
//  pbData              - 要保存的数据
//  ulDataSize          - 数据的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_WriteDataToFile(const char* szFileName, 
							const unsigned char* pbData, unsigned long ulDataSize);

//------------------------------------------------------------------------
//  FILE_OP_AppendDataToFile()   
//                      - 附加数据到文件末尾
//  szFileName          - 文件名
//  pbData              - 要附加的数据
//  ulDataSize          - 数据的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_AppendDataToFile(const char* szFileName, 
							 const unsigned char* pbData, unsigned long ulDataSize);

#ifdef __cplusplus
}
#endif

#endif // _FILEOP_H_


// FileOp.cpp

#include "FileOp.h"

int FILE_OP_GetFileSize(const char* szFileName, unsigned long* pulFileSize)
{
	FILE *fp = fopen(szFileName, "rb");
	if ( fp )
	{
		fseek(fp, 0, SEEK_END);
		*pulFileSize = ftell(fp);
		fclose(fp);
		return 0;
	}
	return -1;
}

int FILE_OP_RetFileSize(const char* szFileName)
{
	int iFileLen = 0;
	FILE *fp = fopen(szFileName, "rb");
	if ( fp )
	{
		fseek(fp, 0, SEEK_END);
		iFileLen = ftell(fp);
		fclose(fp);
	}
	return iFileLen;
}

int FILE_OP_ReadDataFromFile(const char* szFileName, unsigned char* pbData, unsigned long ulDataSize)
{
	unsigned long ulReadedSize = 0;
	FILE *fp = fopen(szFileName, "rb");
	if ( fp )
	{
		ulReadedSize = (unsigned long)fread(pbData, 1, ulDataSize, fp);
		fclose(fp);
		return ( ulReadedSize == ulDataSize ) ? 0 : -1;
	}
	return -1;
}

char* FILE_OP_ReadAllDataFromFile(const char* szFileName)
{
	unsigned long ulFileSize = 0;
	if ( 0 == FILE_OP_GetFileSize(szFileName, &ulFileSize) )
	{
		char* pbBuffer = (char*)malloc(ulFileSize);
		if ( 0 == FILE_OP_ReadDataFromFile(szFileName, (unsigned char*)pbBuffer, ulFileSize) )
		{
			return pbBuffer;
		}
		else
		{
			free(pbBuffer);
			return NULL;
		}
	}
	return NULL;
}

char* FILE_OP_ReadAllDataFromFileEx(const char* szFileName, int flag_sz)
{
	unsigned long ulFileSize = 0;
	if ( 0 == FILE_OP_GetFileSize(szFileName, &ulFileSize) )
	{
		char* pbBuffer = NULL;
		if ( 1 == flag_sz )
		{
			pbBuffer = (char*)malloc(ulFileSize+1);
		}
		else
		{
			pbBuffer = (char*)malloc(ulFileSize);
		}
		
		if ( 0 == FILE_OP_ReadDataFromFile(szFileName, (unsigned char*)pbBuffer, ulFileSize) )
		{
			if ( 1 == flag_sz )
			{
				pbBuffer[ulFileSize] = '\0';
			}
			return pbBuffer;
		}
		else
		{
			free(pbBuffer);
			return NULL;
		}
	}
	return NULL;
}

int FILE_OP_WriteDataToFile(const char* szFileName, const unsigned char* pbData, unsigned long ulDataSize)
{
	unsigned long ulWritedSize = 0;
	FILE *fp = fopen(szFileName, "wb");
	if ( fp )
	{
		ulWritedSize = (unsigned long)fwrite(pbData, 1, ulDataSize, fp);
		fclose(fp);
		return ( ulWritedSize == ulDataSize ) ? 0 : -1;
	}
	return -1;
}

int FILE_OP_AppendDataToFile(const char* szFileName, const unsigned char* pbData, unsigned long ulDataSize)
{
	unsigned long ulWritedSize = 0;
	FILE *fp = fopen(szFileName, "awb");
	if ( fp )
	{
		ulWritedSize = (unsigned long)fwrite(pbData, 1, ulDataSize, fp);
		fclose(fp);
		return ( ulWritedSize == ulDataSize ) ? 0 : -1;
	}
	return -1;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RISC-V C函数手册是一个详尽的手册,为开发人员提供了RISC-V平台上可用的所有C语言函数的详细信息。该手册包含用于基本数字操作、内存操作、字符串操作、数学函数、IO操作、系统调用等各种功能的C函数。可以说这是一个非常有用的手册,因为它使开发人员能够快速了解和使用RISC-V平台上的各种功能,从而提高开发效率。 该手册的目录非常详细,其中包括函数名、函数声明、功能描述、输入参数、输出参数、返回值等重要信息。这些信息对于开发人员来说是非常重要的,在开发过程中可以帮助他们更好地理解函数的用途,正确地使用函数,并在需要的时候进行必要的调试和修复。 总之,RISC-V C函数手册是RISC-V平台上C程序开发人员必备的参考资料。从它身上可以获得关键信息,这有助于开发人员开发可靠的软件,并提高软件的质量和性能。随着RISC-V平台的不断发展和应用,该手册将不断更新和改进,以提供更全面、更有用的信息和功能。 ### 回答2: RISC-V是一种基于开源架构的指令体系结构。为了方便程序员进行开发,RISC-V有一个官方的C语言函数手册。这个手册中包含了所有RISC-V平台上使用的C语言函数。这些函数可以帮助程序员在开发过程中轻松地完成各种操作,比如说内存管理、文件管理、字符串操作等等。 C函数手册大大减少了程序员的代码编写工作。因为这个手册收录了所有常用的C语言函数,程序员可以直接使用这些函数,而不必自己编写代码。这样可以节省时间和精力,让程序员可以更专注于开发自己的业务逻辑部分。 除了常用的C语言函数之外,RISC-V的C函数手册还包含了一些平台相关的函数,这些函数可以帮助程序员处理一些特殊的问题,比如说操作寄存器、处理中断等等。这些函数操作系统和嵌入式领域非常有用,可以帮助程序员编写出高效、精简的系统代码。 总的来说,RISC-V的C函数手册是一份非常有价值的文档,对于RISC-V开发者来说具有重要意义。它可以帮助程序员更快速地开发出高效的程序,提高开发效率和质量。 ### 回答3: RISC-V C函数手册是RISC-V CPU架构的指令架构的一部分,它提供了一套用于C编程的系统调用接口和C库函数。在RISC-V指令架构中,操作系统可以使用该手册的函数和接口来与硬件驱动程序交互,管理内存,进行进程控制等操作。 RISC-V C函数手册包含几个关键部分,以支持C编程和系统调用。这些部分包括标准C库函数、系统调用接口、定时器和计时器接口、异常处理等。 标准C库函数提供了标准数学函数,字符串和输入输出操作等常见的C库函数操作。这些函数与RISC-V硬件指令紧密配合,提供了基本的编程支持。 系统调用接口是RISC-V C函数手册的核心部分,它允许应用程序与操作系统进行交互。例如,系统调用可以管理进程,分配和释放内存,以及管理文件系统。 另外,RISC-V C函数手册还提供了定时器和计时器接口,以支持测量和管理时间。这些接口是应用程序和操作系统中实现各种计时和延迟的基础。 异常处理是RISC-V C函数手册中的另一个重要部分。它提供了在处理硬件设备故障,例如页错误,系统中断和总线故障等方面的支持。 总之,RISC-V C函数手册是一个完整的C库,它为RISC-V CPU架构提供了完整的编程支持。它包含许多关键部分,包括标准C库函数、系统调用接口、定时器和计时器接口、异常处理等,以支持各种常见操作和系统级函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值