欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

errorsk-4nQwBFp0LP8NpyK9WwwoT3BlbkFJyH23SKdFWR1P9Sr63sF8

最编程 2024-08-13 09:04:10
...

#####ANSI C File 操作 File 操作参考网址 : zh.cppreference.com/w/c/io

API接口 说明
fopen int fopen(const char* filename,const char *mode)
fclose int fclose(FILE * stream)
ftell ftell(FILE* stream) 获取文件位置的指针
feof feof(FILE*stream) 如果到了文件末尾 返回 非0的值 否则返回0
rewind void rewind(FILE *stream) 将文件指针移动到文件的开头位置
remove remove(const char *filename)
rename rename(const char*oldname,const char *newname)
fflush int fflush(FILE*stream); 刷新文件缓冲区
fgets char* fgets(char str,int num , FILEstream) 从文件中读取一行
fputs int fputs(const char *str,FILE *stream); 输出一行字符串到文件中
fread int fread(void*buffer,int size,int count,FILE *stream)
fwrite int fwrite(void *buffer,int size,int count,FILE *stream)
fseek int fseek(FILE*stream,long int offset,int origin)
fprintf int fprintf(FILE*stream,const char *format[,argument])
fputc/fgetc 从文件中读取/输出一个字符
#####fopen 函数原型
int fopen(const char* filename,const char *mode)
mode 可选项如下:
mode 说明
---- ----
r 以只读方式打开文件,该文件必须存在
w 打开只写文件,如果文件不存在,则会创建一个新文件;程序会从文件的开头写入内容,如果文件存在,则该会被截断为零长度,重新写入
a 以追加模式写入文件,如果文件不存在,则会创建一个新文件,如果文件存在,程序会在已有的文件内容中追加内容
r+ 打开一个文本文件,允许读写文件,该文件必须存在
w+ 打开一个文本文件,允许读写文件;如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件
a+ 打开一个文本文件,允许读写文件;如果文件不存在,则会创建一个新文件;读取会从文件的开头开始,写入则只能是追加模式

如果打开的二进制文件,需要使用下面的访问模式:

rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

预定义标准流: stdin:和标准输入流关联的 File* 类型 stdout:和标准输出流关联的 File* 类型 stderr:和标准错误输出流关联的 File* 类型

int main(int argc,char * argv[])
{
MI_PRINT("This is my standard C demo! %s build date:%s %s\n",__FUNCTION__,__DATE__,__TIME__);
MI_PRINT("argv[1] is %s \n", argv[1]); // argv[0] is programme name
FILE *fp = fopen(argv[1],"w+");
CHECK_RET(fp);

MI_S32 count = 0;
while( !feof(fp))
{
count = fread(read_buffer,sizeof(MI_U8),buffer_size,fp);
// ftell(FILE* stream) 获取文件位置的指针
DBG_ERR("the read buffer length is %d content is %s \n",count,read_buffer);
MI_PRINT("The Current file location is %d \n",ftell(fp));
}
rewind(fp);  
MI_PRINT("The Current file location is %d \n",ftell(fp));

strcpy(write_buffer,"this is tonychen add  hahaha !!\n");
count = fwrite(write_buffer,sizeof(MI_U8),strlen(write_buffer),fp);
MI_PRINT("The write count is %d \n",count);

fflush(fp);
//MI_PRINT("The Current file location is %d \n",ftell(fp));

rewind(fp);  
fgets(read_buffer,20,fp);
MI_PRINT("The readbuffer is %s \n",read_buffer);

fgets(read_buffer,100,fp);
MI_PRINT("The readbuffer is %s \n",read_buffer);

MI_S8 ret = -1;
if( (ret = remove("my.txt")) == 0) {
	MI_PRINT("remove file success !! \n");
} else {
	MI_PRINT("remove file fail \n");
}

ret = rename("my1.txt","my2.txt");
MI_PRINT("The ret value of my.txt is %d \n",ret);
rewind(fp);
fgets(read_buffer,100,stdin);
MI_PRINT("The readbuffer is %s \n",read_buffer);


fseek(fp,0,SEEK_SET);
fputs(read_buffer,fp);

fseek(fp,0,SEEK_SET);
MI_PRINT("The Current file location is %d \n",ftell(fp));
fseek(fp,0,SEEK_END);
MI_PRINT("The Current file location is %d \n",ftell(fp));
fseek(fp,-20,SEEK_END);
MI_PRINT("The Current file location is %d \n",ftell(fp));
rewind(fp);
fseek(fp,100,SEEK_CUR);
MI_PRINT("The Current file location is %d \n",ftell(fp));
fseek(fp,0,SEEK_END);
fprintf(fp,"This is MY demo %s %s \n",__DATE__,__TIME__);

fclose(fp);
return 0;
}

#####基本输入输出函数

元素 说明
printf 向终端输出格式化字符串
puts/gets puts(const char* buffer)
getc getchar getc(char c,File* stream)
scanf 从终端按照格式获取内容
sscanf 从Buffer 中按照格式获取内容
sprintf 按照格式化字符串组成buffer
  • sscanf 用法详解 sscanf int sscanf(char *buffer,const char *format[argument])

format: %s 字符串 读取字符串截止的标志是 空格 跳格 或者 换行 %*s 忽略某个字符串 %[^/] 匹配字符 / %[^=] 匹配字符 = %*[^/] 忽略开始到 / 中间的字符串 %4s 截取前面四个字符串

void testsscanfOperation() {

	printf(" %s start...... \n", __FUNCTION__);
	uint8_t ValueA = 0;
	uint8_t ValueB = 0;
	uint8_t StringBufferP[100] = { 0 };
	uint8_t StringBufferV[100] = { 0 };
	uint8_t InputBuffer[100] = { 0 };

#if 0
	/* %*s 表示忽略 某个字符串  */
	/*读取字符串截止的标志是 空格 跳格 或者 换行*/
	strcpy(InputBuffer, "3+5=4");
	//strcpy(InputBuffer, "tony like reading");
	sscanf(InputBuffer, "%d %s %d", &ValueA, StringBufferP, &ValueB);
	printf("The ValueA is %d ValueB is %d \n", ValueA, ValueB);
#endif

	strcpy(InputBuffer, "tony like reading");
	sscanf(InputBuffer, "%s %*s %s", StringBufferP, &StringBufferV);
	printf("The stringbufferP is %s \n", StringBufferP);
	printf("The stringbufferV is %s \n", StringBufferV);

	/*用于字符串的截取 特定的长度*/
	strcpy(InputBuffer, "GodBlessyou");
	sscanf(InputBuffer, "%3s", StringBufferP);
	sscanf(InputBuffer, "%8s", StringBufferV);
	printf("The stringbufferP is %s \n", StringBufferP);
	printf("The stringbufferV is %s \n", StringBufferV);


	strcpy(InputBuffer, "bootvideo=/system/media/bootvideo.mp4");
	sscanf(InputBuffer, "%[^=] %*1s %s", StringBufferP, StringBufferV); // 忽略掉 = 字符
	printf("The stringbufferP is %s \n", StringBufferP);
	printf("The stringbufferV is %s \n", StringBufferV);

	strcpy(InputBuffer, "/system/media/bootvideo.mp4");
	sscanf(InputBuffer, "%*[^/] %s %*[^/]", StringBufferP);
	printf("The stringbufferP is %s \n", StringBufferP);

	// 截取 空格之前的字符串
	sscanf("123456 abcdedf", "%[^ ]", StringBufferP);
	printf("%s\n", StringBufferP);

	// 表示只是匹配 1-9a-z 的字符串
	sscanf("123456abcdedfBCDEF", "%[1-9a-z]", StringBufferP);
	printf("%s\n", StringBufferP);

	printf("--------------------- \n");
	memset(InputBuffer, 0x00, sizeof(InputBuffer));
	ValueA = 100;
	ValueB = 200;
	sprintf(InputBuffer, "%d is %s %d %s %d", ValueA + ValueB, "equal", ValueA, "+", ValueB);
	printf("The InputBuffer is %s \n", InputBuffer);
}
运行结果:
demoMain Run ....
 testsscanfOperation start...... 
The stringbufferP is tony 
The stringbufferV is reading 
The stringbufferP is God 
The stringbufferV is GodBless 
The stringbufferP is bootvideo 
The stringbufferV is /system/media/bootvideo.mp4 
The stringbufferP is bootvideo 
123456
123456abcdedf
--------------------- 
The InputBuffer is 300 is equal 100 + 200