C语言文件相关函数

文件描述符

1、对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或者创建一个新文件时, 内核向进程返回一个文件描述符。当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write.

按照惯例,UNIX shell使用文件描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符2与标准错误输出相结合。STDIN_FILENO、STDOUT_FILENO、 STDERR_FILENO这几个宏代替了0、1、2这几个数。0:标准输入。

2、文件描述符,这个数字在一个进程中表示一个特定含义, 当我们open一个文件时, 操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护的这个动态文件的这些数据结构绑定上了,以后我们应用程序如果要操作这个动态文件,只需要用这个文件描述符区分。

3、文件描述符的作用域就是当前进程,出了这个进程文件描述符就没有意义了。
open函数打开文件,打开成功返回一个文件描述符,打开失败,返回-1。

man目录

1:可执行程序
2:系统调用
3:库函数
4:特殊文件
5:文件格式和规范
6:游戏
7:杂项,包括宏包和规范
8:系统管理命令

文件操作

open 打开 read/write 读写 lseek 光标定位 close 关闭
文件的权限:用 ls -l查看
程序:可读 r 4
可写 w 2
执行 x 1
例如0600:可读可写 不能执行

open函数

在这里插入图片描述

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

int main()
{
        int fd;
        char *buf = "Dong Rui Long shi SB!";

        fd = open("./test\n",O_RDWR);

        if(fd == -1)
        {
                printf("open failed\n");
                fd = open("./test",O_RDWR|O_CREAT,0600);
                if(fd > 0)
                {
                        printf("create test success!n");
                }
        }

        printf("open success \nfd = %d\n",fd);

        write(fd,buf,strlen(buf));

        close(fd);

        return 0;
}

在这里插入图片描述
我们可以看到文件已经写入成功 也生成了test无类型文件,我们打开它:
写入成功
写入字符串成功

read函数

在这里插入图片描述

read从光标处开始读 所以要把光标移到头(重新定位光标 lseek) 或者 重新打开在这里插入图片描述
set指头 cur指当前位置 end指尾巴
第二个参数是偏移值 对whence的一个偏移值

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

int main()
{
	int fd;
	char *buf = "Dong Rui Long shi SB!";

	fd = open("./test\n",O_RDWR);

	if(fd == -1)
	{
		printf("open failed\n");
		fd = open("./test",O_RDWR|O_CREAT,0600);
		if(fd > 0)
		{
			printf("create test success!\n");
		}
	}

	printf("open success \nfd = %d\n",fd);

	int n_write = write(fd,buf,strlen(buf));
	if(n_write != -1)
	{
		printf("write %d byte to test\n",n_write);
	}
	
	//mession one:
	//close(fd);
	//fd = open("./test\n",O_RDWR);

	
	char *readBuf;
	readBuf = (char *)malloc(sizeof(char)*n_write + 1);

	//lseek(fd,-(n_write),SEEK_CUR);
	lseek(fd,0,SEEK_SET);

	int n_read = read(fd,readBuf,n_write);
	printf("read %d ,context:%s\n",n_read,readBuf);

	close(fd);

	return 0;
}

创建文件函数 creat

在这里插入图片描述

cp指令的练习

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

int main(int argc,char **argv)
{
	int fdscr;
	int fddes;

	char *readbuf = NULL;

	if(argc != 3)
	{
		printf("error!\n");
		exit(-1);
	}

	fdscr = open(argv[1],O_RDWR);
	int size = lseek(fdscr,0,SEEK_END);
	lseek(fdscr,0,SEEK_SET);

	readbuf = (char *)malloc(sizeof(char)*size + 8);
	int n_read = read(fdscr,readbuf,size);

	fddes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);

	int n_write = write(fddes,readbuf,strlen(readbuf));
	
	close(fdscr);
	close(fddes);

	return 0;
}

配置文件的修改例子
待添加

标准c库写文件

在这里插入图片描述
fread和fwrite的size_t 返回值取决于第三个参数!
也可以将结构体应用 这里不想写了在这里插入图片描述

其他文件api

fputc:
在这里插入图片描述
fgetc、feof:
一个个字符读文件
判断是否到达文件尾巴

#include <stdio.h>

int main ()
{
   FILE *fp;
   int c;
   int n = 0;
  
   fp = fopen("file.txt","r");
   if(fp == NULL) 
   {
      perror("打开文件时发生错误");
      return(-1);
   }
   do
   {
      c = fgetc(fp);
      if( feof(fp) )
      {
          break ;
      }
      printf("%c", c);
   }while(1);

   fclose(fp);
   return(0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

llechee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值