自学嵌入式 day 24 -系统编程 文件
一、文件
1.标准io
stdio.h:标准输入输出库(以计算机为中心)
(1)头文件: stdio.h ==》标准输入输出头文件
/usr/include/stdio.h
<> 是系统库函数,默认路径在/usr/include/
路径 : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库
"" 是用户自定义函数,默认是当前路径
路径: ===>xxx.h ===>xxx.c
(2)man指令
man xxx ===>查看当前xxx命令
①NAME:对函数进行粗略介绍
②SYNOPSIS:有关头文件和函数原型(函数的返回值和参数类型)
③DESCRIPTION:对参数的详细说明
④RETURN VALUE:对返回值的描写
3.对文件进行操作(标准io)
(1)步骤:
①打开文件
②读写文件
③关闭文件
注:FILE :文件流指针
(2)函数:
①fopen:
FILE *fopen(const char *path, const char *mode);
功能:打开一个文件并建立一个流指针
参数:path:要打开文件的路径
mode:
r :只读文件不存在报错,文件存在则只读打开
r+ 读写:文件不存在报错,文件存在则读写打开
w 只写:文件不存在则创建,文件存在则清0只写打开
w+ 写读:文件不存在则创建,文件存在则清0写读打开
FILE *fp = fopen("1.txt","w");
if(NULL == fp)
{
fprintf(stderr,"error\n");
return 1;
}
②fputc:
int fputc(int c, FILE *stream);
功能:向流中写入一个字符
参数:c:要写入的字符
stream:文件流指针
返回值:成功返回写入的字符ASCII码值,失败返回EOF
#include<stdio.h>
int main()
{
FILE *fp = fopen("1.txt","w");
if(NULL == fp)
{
fprintf(stderr,"error\n");
return 1;
}fputc('h',fp);
fputc('e',fp);
fputc('l',fp);
fputc('l',fp);
fputc('o',fp);fclose(fp);
return 0;
}
③fgetc
int fgetc(FILE *stream);
功能:从流中读取一个字符
参数:stream:文件流指针
返回值:成功返回读到字符的ASCII码值,读到文件末尾返回EOF
while(1)
{
int c = fgetc(fp_cp);
if(EOF == c)
{
break;
}
printf("%c",c);
}
注:利用fgetc/fputc实现Linux系统的复制命令:
#include <stdio.h>
// ./a.out srcfile1 dstfile2
int main(int argc, char** argv)
{
if(argc<3)
{
fprintf(stderr, "usage:./a.out srcfile dstfile\n");
return 1;
}
FILE* src = fopen(argv[1], "r"); // argv[1]
FILE* dst = fopen(argv[2], "w"); // "argv[2]"if (NULL == src || NULL == dst)
{
fprintf(stderr, "fopen error\n");
return 1;
}while (1)
{
int c = fgetc(src);
if(EOF == c)
{
break;
}
fputc(c, dst);
}fclose(dst);
fclose(src);
// system("pause");
return 0;
}
④fgets:
char buf[5]={0};
fgets(buf,5,stdin);
char *fgets(char *s, int size, FILE *stream);
功能:从stream流对象关联的文件中获取size大小字节的文本数据并存储到s对应的本地内存(栈区数组,堆区内存)
参数: s 要存储数据的本地内存
size 要获取的数据长度,单位字节。
stream 要获取的目标文件流对象,可以是stdin ,程序会阻塞等待如果是普通文件fp 则指向文件第一行数据
返回值:成功 返回指向有效数据的首地址,一般等于s的地址,失败或者文件末尾返回NULL;
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE* fp = fopen("/etc/passwd","r");
if(NULL == fp)
{
fprintf(stderr,"fopen error\n");
return 1;
}while(1)
{
char buf[1024]={0};
if(NULL == fgets(buf,sizeof(buf),fp))
{
break;
}
printf("%s",buf);
}
fclose(fp);
return 0;
}
⑤fputs:
int fputs(const char *s, FILE *stream);
功能:从s所在的本地内存中获取一行数据,并写入stream对应的文件流对象。
参数:s 要写的信息,一般是固定的字符串或者有数据的数组。
stream 要写入的目标文件流对象
返回值:成功 nonnegative number on success,失败 -1;
#include<stdio.h>
int main(int argc,char *argv[])
{
if(argc < 2)
{
fprintf(stderr,"usage: ./a.out filename");
return 1;
}
FILE* fp = fopen(argv[1],"w");
// FILE* fp = fopen("4.txt","w");
if(NULL == fp)
{
fprintf(stderr,"fopen error");
return 1;
}
fputs("hello",fp);
fputs("world",fp);
return 0;
}
注:利用fgets/fputs实现Linux系统的复制命令:
#include<stdio.h>
int main(int argc,char*argv[])
{
if(argc < 3)
{
fprintf(stderr,"usarge: ./a.out srcname destname");
return 1;
}
FILE* fp = fopen(argv[1],"r");
FILE* cp = fopen(argv[2],"w");
if(NULL == fp || NULL == cp)
{
fprintf(stderr,"fopen error");
return 1;
}
while(1)
{
char buf[1024] = {0};
if(NULL == fgets(buf,sizeof(buf),fp))
{
break;
}
fputs(buf,cp);
}
fclose(fp);
fclose(cp);
return 0;
}
⑥fclose
int fclose(FILE *stream);
功能:关闭文件
参数:stream:文件流指针