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");
}