C语言二进制文件读写程序实现(基础)

C语言二进制文件读写程序实现(基础)

由于对文件操作比生疏,这里拿一个最近的一个程序来学习和备忘。

/**
* 该文件实现将数字文本保存为二进制文件。
* 这里保存的二进制格式为 unsigned short int
* 这里主要用到fwrite,fread
*/

#include <stdio.h>
#include <string.h>

#define NAMELEN 256
#define isDigitChar(ch) ((ch)>='0' && ((ch)<='9'))
#define fprintData(file, val) fprintf((file), "%hu", (val))
//%hu is for unsigned short int; %hd is for short int

typedef unsigned short int DataType;
const int DATATYPESIZE = sizeof(DataType);

void autoOutputFilename(char* outputFile, const char* inputFile);//auto names outputFile
int  transCharFileToIntFile(const char* in_filename, char* out_filename);
int  readFromBinaryFile(const char* filename);

int main(int argc, char** argv){
	char in_filename[NAMELEN];
	char out_filename[NAMELEN];
	
	while(gets(in_filename)){
		if(transCharFileToIntFile(in_filename, out_filename)){
			printf("Unsuccessful file operator!\n");
		}
		else{
			printf("Success!\n");
			readFromBinaryFile(out_filename);
		}/**/		
	}

	return 0;
}

//return -1 means unsucessful, 0 sucessful.
int transCharFileToIntFile(const char* in_filename, char* out_filename){
    FILE *f_input = NULL, *f_output = NULL; 
	char ch = 0, preChar = 0;
	DataType val = 0;
	
	//file opreator
	f_input = fopen(in_filename, "r");
	if(NULL == f_input) return -1;
	
	autoOutputFilename(out_filename, in_filename);
	f_output = fopen(out_filename, "wb");  // b means binary file
	if(NULL == f_output) {fclose(f_input); return -1;}
	
	//get output
	while((ch = fgetc(f_input))!=EOF){
		if(isDigitChar(ch)){
			val = val*10 + (ch-'0');
		}
		else{
			if(isDigitChar(preChar)){
				fwrite(&val, DATATYPESIZE, 1, f_output);
				val = 0;
			}
		}
		preChar = ch;
	}
	if(isDigitChar(preChar)){
		fwrite(&val, DATATYPESIZE, 1, f_output);
		//size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
	}
	
	//file close
	fclose(f_input);
	fclose(f_output);
	return 0;
}

int readFromBinaryFile(const char* filename){
	DataType val;
	FILE* fp = fopen(filename, "rb");

	if(NULL == fp){
		return -1;
	}

	//Read block of data from stream 
	//size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
	while(fread(&val, sizeof(DataType), 1, fp) == 1){//freadis 
		fprintf(stdout, "%hu\n", val);
	}

	fclose(fp);
	return 0;
}

void autoOutputFilename(char* out_name, const char* in_name){
	int i = 0, flag = 0;
	strcpy(out_name, in_name);
	strcat(out_name, ".bit16");
}


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值