Linux 文件编程

一、 Linux系统调用及用户编程接口(API)

1、所谓系统调用是指操作系统提供给用户的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的的服务。


系统调用仅仅是一个通过软中断机制向内核提交请求,以获取内核服务的接口。在实际使用中程序员调用的通常是用户编程接口—API,系统命令相对API更高了一层,它实际上是一个可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能。

 2、Linux一点哲学,“一切皆为文件”;在Linux中对目录和设备的操作都等同于对文件的操作,都是使用文件描述符来进行的。
       Linux文件可分为:普通文件,目录文件,链接文件,设备文件

 3、一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理 

             标准输入         0            STDIN_FILENO

             标准输出         1            STDOUT_FILENO

             标准出错         2            STDERR_FILENO

      常创建模式:
      S_IRUSR      可读
      S_IWUSR     可写
      S_IXUSR      可执行
      S_IXRWU     可读、可写、可执行
      除用以上宏来选择创建模式,也可以用数字来表示


二、系统调用函数    

        1 创建文件   creat  

         #include <stdio.h>
         #include <sys/types.h>
         #include <sys/stat.h>
         #include <fcntl.h>
         #include <stdlib.h>

           int main()
             {
          int ret;
          ret = creat("creat.txt",S_IRWXU | S_IRWXG); //文件拥有者和同组其他人
          if (ret == -1)
          {
          perror("creat");       
          exit(1);
           }
                        return 0;
             } 

        2  打开文件   open

#include <string.h>


int main()
{
int fd,ret;
/*char buf[100] = {"hello world"};*/
char buf[100] = {0};
        fd = open("creat.txt",O_RDWR | O_CREAT ,0666);        

        if (-1 == fd)
{

perror("open");
exit(1);
}
/* ret = write(fd,buf,strlen(buf));

if (-1 == ret)
{
perror("write");
exit(1);
}*/

/ memset(buf,0,strlen(buf));
        ret = read(fd,buf,sizeof(buf));
if (-1 == ret)
{
perror("read");
exit(1);
}
printf("READ TXT is:%s\n",buf);
close(fd);
return 0;
}

3、利用read函数,write函数实现cp命令   

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
int fd[2] = {0};
int ret;
char buf[100] = {0};


fd[0] = open(argv[1],O_RDONLY);
if(fd[0] < 0)
{
perror("open1");
exit(1);
}
fd[1] = open(argv[2],O_RDWR | O_CREAT | O_EXCL,777);    
if (fd[1] < 0)
{
perror("open2");
exit(1);
}

while((ret = read(fd[0],buf,sizeof(buf))) != 0)
{
ret = write(fd[1],buf,ret);
if (ret < 0)
{
perror("write");
exit(1);
}
memset(buf,0,sizeof(buf));          
}

      return 0;
}

4、int lseek(int fd, offset_t offset,  int whence)
      功能:将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置
      SEEK_SET    相对文件开头      SEEK_CUR      当前位置          SEEK_END    相对文件末尾

三、标准库函数

1、标准I/O提供缓存的目的就是减少调用read和write的次数,它对每个I/O流自动进行缓存管理(标准I/O函数通常调用malloc来分配缓存)。
      它提供了三种类型的缓存:    1) 全缓存。当填满标准I/O缓存后才执行I/O操作。磁盘上的文件通常是全缓存的。    2) 行缓存。当输入输出遇到新行符或缓存满时,才由标准         I/O库执行实际I/O操作。stdin、stdout通常是行缓存的。    3) 无缓存。相当于read、write了。stderr通常是无缓存的,因为它必须尽快输出。

2、库函数创建与打开

      r 只读方式打开,文件必须已存在    w 只写方式打开,如果文件不存在则创建,文件存在清空重写    a只能在末尾追加数据,文件不存在则创建

四、标准库函数

 fread 与 fwrite  

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

int main()
{
FILE *fp;
int ret;
char buf[100] = {0};
scanf("%s",buf);

        fp = fopen("hello.txt","w");

        if (fp == NULL)
{
perror("fopen");
exit(1);
}
/* ret = fread(buf,1,sizeof(buf),fp);

       if (ret == 0)
{
perror("fread");
exit(1);
}
printf("%s",buf);*/

        ret = fwrite(buf,1,strlen(buf),fp);

        if (ret == 0)
{
perror("fwrite");
exit(1);
}


return 0;
}

利用fread函数实现cat命令

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[])       (利用命令行参数输入)
{
FILE *fp;
int ret;
char buf[100] = {0};

       fp = fopen(argv[1],"r");

       if (fp == NULL)
{
perror("fopen");
exit(1);
}


while((ret = fread(buf,1,sizeof(buf)-1,fp)) != 0)      (最好减1)
{
printf("%s",buf);
memset(buf,0,sizeof(buf));
}


return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值