文件IO的学习

一、带参main函数
1.1概述:
和标准C语言的一个区别:带有参数。 int argc  char *argv[]
每一个命令都是可以带参数的,并且每一个命令都是可执行程序(每个命令都是放在对应的bin或者sbin文件下),而且每一个命令都是具有一个main函数的,并且可以带相应的参数。
例如:touch -->main (int argc,char *argv[])
1.2格式:
定义:main函数的格式:int main (int argc,char *argv[])
这个格式参数在运行的时候才会生效。argc-->运行时参数的个数(包含可执行参数本身)
argv[]-->各个参数的指针(识别的字符串)
./a.out-->argv[0]
注意:vim实现代码的清屏操作,操作步骤?
首先进入vim 打开对应的文件 ,按esc按键,接着按下d按键,最后按下大写G按键
编写的代码必须是以.c结尾的,gcc会去查询文件的类型

二、文件操作
Linux系统的特点:一切皆文件。对操作系统的文件进行操作,就操作相关的API函数,根据文件的操作平台不同,
文件操作又分为两大类:第一类:文件IO;第二类:标准IO
2.1概念
应用层:具有缓冲的功能,均属于标准IO的类型
内核层:文件IO存在的地方
驱动层:文件IO
在文件层面:应用层、驱动层(内核中,内核的底层)
数据方面:数据在应用层是以缓冲的形式存在。
在操作文件的时候核心是读写操作,将数据从缓存空间中读出,写入到对应的文件中printf();
将数据从文件读出,写入到对应的缓存空间中去scanf()。
2.3文件IO与标准IO的区别
第一个应用平台的不同
文件IO
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
标准IO
#include <stdio.h>
2.4文件IO的概述
文件IO是文件操作中的一类函数--->API
2.4.1特性
第一类:文件IO的特殊类型。Linux内核打开一个文件,这个时候内核会给每个文件分配一个文件描述符fd,--->相当于身份证
第一个:
标准输入:stdin-->对应的文件标识符为0   键盘
标准输出:stdout-->对应的文件标识符为1   屏幕
标准错误:stder-->对应的文件标识符为2
第二类:文件IO的一般特性
可以称为非特殊类型,主动调用open()分别打开了不同的文件来获得对应的文件描述符--fd,
文件描述符和文件是绑定在一起的,并且具有唯一性。持续到调用了close(fd),相应的程序运行就结束了。

三、文件IO操作流程:
首先,先用open函数操作文件,根据要实现的功能对文件进行操作write()/read()/lseek(),
对文件进行操作,操作完调用文件需要的函数,close(fd);
文件操作三步走:
第一步:打开open 
第二步:读/写 read/write
第三步:关闭:close
open函数里面的权限参数该怎么使用?
1:O_RDONLY 是以只读方式打开
2:O_RDWR 以可读-可写的方式打开
3:O_RDWR|O_CREAT 以可读-可写-可创建的方式
4:O_RDWR|O_CREAT|O_APPEND 可读可写—以追加方式  
5:O_RDWR|O_CREAT|O_TRUNC 可读可写可创建—以覆盖的方式
思考:文件如果不存在是否创建?是否需要检测? 创建:O_CREAT 需要第三个参数  文件权限
思考:如果文件存在需要对文件进行什么操作? 只读,只写,还是读写
思考:如果具有写操作,是覆盖的写还是追加的写?  覆盖,追加
================================================
open函数
函数原型:int open(const char*pathname,int flags);
int open(const char*pathname,int flags,mode_t mode);
参数:const char* pathname  确定打开文件的路径
int flags   确认打开方式,O_RDONLY\O_WRONLY O_RDWD-->(只读、只写、可读可写)
mode_t mode 设置对应的权限。
返回值:成功  返回对应文件的文件描述符
        失败 -1
功能:打开一个文件,并为文件分配一个文件描述符
文件描述符:进程打开的文件顺序编号即:这个文件是这个进程打开的第几个文件,
每个进程运行,默认打开3个文件
文件描述符是从0开始的,文件描述符并不是inmod号。
=====================================================
close函数  关闭函数
原型:int close(int fd)
参数:int fd  表示关闭对应文件的文件描述符。
返回值:成功 返回 0
        失败 返回 -1
功能:关闭一个文件的文件描述符。
====================================================
write 写文件函数
原型:ssize_t write(int fd,const void *buf,size_t count);
参数:int fd             表示文件的文件描述符
const void *buf    表示缓存空间的地址。
size_t count       表示期望写入的长度
返回值:成功 返回实际写入的长度
        失败 返回-1
功能:将对应的数据从缓存空间里面,写入到指定的文件中
read  读文件函数
原型:ssize_t read(int fd,void *buf,size_t count);
参数:int fd;   表示文件描述符
      void *buf 表示缓存空间的地址
      size_t count  表示期望读取数据的长度
      
返回值:成功 返回实际读取的数据长度
        失败 -1
功能:从文件中读取数据,再将数据写入到对应的buf里面
=======================================================
lseek 表示调节文件读写位置    //说明 读文件的pc指针,指向文件的开头。//abcef
原型:off_t lseek(int fd,off_t offset,int whence);   
参数:int fd;        //表示文件的文件描述符
off_t offset   //表示相对偏移量 1
int whence     //表示偏移基点,一般有三种偏移形式
SEEK_SET(表示起始位置)
SEEK_CUR(表示当前位置)
SEEK_END(表示文件的结尾)
返回值:相当于起始位置的偏移量
功能:自由的调整文件的读写位置
例子:第一种:将文件的读写位置调整到开始位置后的第5个字节
lseek(fd,5,SEEK_SET);
第二种:将文件的读写位置调整到文件的结尾
lseek(fd,0,SEEK_END);
第三个:将文件的读写位置调整到当前位置的前两个字节
lseek(fd,-2,SEEK_CUR);

四、文件读写位置
在文件操作中,可以采用以下方法修改读写位置

1、open-->默认情况pc指针会指向对应文件的开头的位置。
2、open(路径,O_APPEND);pc指针调整文件的结尾
3、write()和read() -->可以向文件的末尾进行偏移,偏移长度和实际的数据长度是一样的。
4、lseek()函数-->偏移位置有参数决定,偏移基点来决定哪个位置是起始位置。

代码;

//第一个main函数例子
#include <stdio.h>
int main(int argc,char *argv[])
{
    int a;
    printf("argc:%d\r\n",argc);
    for(a=0;a<argc;a++)
    {
        printf("argv[%d]=%s\r\n",a,argv[a]);
    }
    return 0;
}


//二、加法器的效果
 

//atoi函数功能:从参数nptr指向的字符串中提取一个数字(识别转换符号:+-*/和0-9数字,使用乘法的时候需要用引号标注)
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
    int a,sum = 0;
    printf("argc:%d\r\n",argc);
    for(a=0;a<argc;a++)
    {
        sum += atoi(argv[i]);
    }
    printf("sum =%d\r\n",sum);
    return 0;
}
//计算器的效果,注意:不能输入小数,只能输入整数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
    int data1;
    int data2;
    if(argc != 4)
    {
        printf("please use format:%s filename\r\n",argv[0]);
        return -1;
    }
    data1 = atoi(argv[1]);
    data2 = atoi(argv[3]);
    switch(*argv[2])
    {
        case '+':printf("data1:%d + data2:%d = %d\r\n",data1,data2,data1+data2);break;
        case '-':printf("data1:%d - data2:%d = %d\r\n",data1,data2,data1-data2);break;
        case '*':printf("data1:%d * data2:%d = %d\r\n",data1,data2,data1*data2);break;
        case '/':printf("data1:%d / data2:%d = %f\r\n",data1,data2,(float)data1/data2);break;
    }
    return 0;
}
//3、cat 命令
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFSIZE 128
int main(int argc,char *argv[])
{
    int fd;
    char buff[BUFFSIZE] = {0};
    int ret = 0;
    if(argc != 2)
    {
        printf("please use format :%s filename \r\n",argv[0]);
        return -1;
    }
    fd = open(argv[1],O_RDONLY);
    if(fd == -1)
    {
        printf("open file erro\r\n");
        return -2;
    }
    while(1)
    {
        ret = read(fd,buff,BUFFSIZE);
        if(ret < BUFFSIZE)
        {
            write(1,buff,ret);
            break;
        }
        write(1,buff,ret);    
    }
    close(fd);
    return 0;
}
//4cp 命令
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFSIZE 128
int main(int argc,char*argv[])
{
    int fd1,fd2,i;
    char buff[BUFFSIZE];
    if(argc != 3)
    {
        printf("open file please use format :%s filename\r\n",argv[0]);
        return -1;
    }
    fd1 = open(argv[1],O_RDONLY);
    if(fd1 == -1)
    {
        printf("open file erro\r\n");
        return -2;
    }
    fd2 = open(argv[2],O_RDWR|O_CREAT|OTRUNC,0666);
    if(fd2 == -2)
    {
        printf("creat file is erro\r\n");
        return -3;
    }
    while(1)
    {
        i = read(fd1,buff,BUFFSIZE);
        if(i < BUFFSIZE)
        {
            write(fd2,buff,i);
            break;
        }
        write(fd2,buff,i);
    }
    close(fd1);
    close(fd2);
    return 0;
}
//5操作文件x,先往文件x中写入数据,之后再从文件x里面读取数据
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFSIZE 256
int main(int argc,char *argv[])
{
    int fd;
    char t_buff[BUFFSIZE] = "你还爱我吗?爱请扣一,不爱就say goodbye\r\n";
    char r_buff[BUFFSIZE] = {0};
    if(argc != 2)
    {
        printf("please use format:%s filename \r\n",argv[0]);
        return -1;
    }
    fd = open(argv[1],O_RDWR|O_CREAT|O_TRUNC,0666);
    write(fd,t_buff,strlen(t_buff));
    lseek(fd,0,SEEK_SET);
    read(fd,r_buff,strlen(r_buff));
    printf("%s\r\n",r_buff);
    close(fd);
    return 0;
}
//6、touch命令
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
    int fd;
    if(argc != 2)
    {
        printf("请使用格式:%s文件名\n",argv[0]);
        return -1;
    }
    fd = open(argv[1],O_CREAT | O_EXCL,0777);
    if(fd == -1)
    {
        printf("%s已存在\n",argv[1]);
    }
    else
    {
        printf("创建文件%s成功\n",argv[1]);
    }
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值