linux编程—文件编程

文件编程——基本API

文件编程相关API博文推荐
以下的API为必须掌握的基本API,还有其他函数需要用到时再查即可。

基于文件流指针的C库函数文件编程

#include <stdio.h>
//函数原型:
FILE *fp;//  *stream
char buf[1000];//用该内存暂存数据,做缓冲区  *ptr
FILE *fopen(const char *pathname, const char *mode);//打开某路径(缺省为当前路径)文件,打开模式
int fseek(FILE *stream, long offset, int whence);//移动文指针指向内容的光标,偏移值,绝对坐标
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);//读到缓存区buf,读多少,读几次,从文件指针指向的文件中读取
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);//把buf中的数据,写多少,写几次,写到文件指针指向的文件
int fclose(FILE *stream);     //关闭文件指针指向的文件,这一步不能忽略,不然再文件编程中可能会损坏文件

文件打开模式mode:
-------------------只读----------只写--------追加--------可读可写--------可读写创建--------可读写追加
---------文本:—r---------------w------------a-------------r+ ----------------w+ ------------------a+ ----------
二进制文件:—rb-------------wb----------ab------------rb+ --------------wb+ -----------------ab+ --------
whence:
SEEK_SET文件首------SEEK_END文件尾------SEEK_CUR当前位置

基于文件描述符的系统调用文件编程

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

int fd;//定义文件描述符   文件描述符:0.标准输入  1.标准输出  2.标准错误
char buf[100];//*buf
//函数原型:
int open(const char *pathname, int flags);//打开指定路径(路径缺省为当前路径)的指定文件,打开的权限(如果要创建,会有第三个创建文件权限的参数)
off_t lseek(int fd, off_t offset, int whence);//移动文件描述符指定文件内容的光标,偏移值,绝对路径,和上面的标准库fseek的whence参数一样,该函数还有个功能。通过返回文件光标从首移到尾的值获取文件大小
ssize_t read(int fd, void *buf, size_t count);//从文件读,读到buf缓存区,读多少
ssize_t write(int fd, const void *buf, size_t count);//数据写入文件,把buf中的数据写到文件,写多少
int close(int fd);//关闭文件描述符 指定的文件,文件编程中不要省略这一步,可能损坏文件。

(权限)flags:
O_RDONLY —只读 O_WRONLY—只写 O_RDWR—可读可写
O_CREAT—文件不存在则创建,需要指定创建文件权限。如0600.
O_EXCL—若同时指定O_CREAT.文件存在则出错。
O_APPEND—每次写入内容都加到文件末尾。
O_TRUNC—打开的文件,若有内容则清空。
*补充:int creat(const char filename,mode_t mode);创建文件。
mode:
S_IRUSR — 4 — 0600 可读
S_IWUSR — 2 — 可写
S_IXUSR — 1 — 可执行
S_IRWXU — 7 — 可读可写可执行

其他API

(1)fputc

int fputc(int c, FILE *stream);
c:  整形数、字符、字符串
stream: 目标文件,将c写入到目标文件

(2)fgetc

int fgetc(FILE *stream);
作用:将文件中的字符一个个读到返回的c中,然后再printf输出

(3)feof

int feof(FILE *stream);
作用:测试是否到达文件的尾巴,
	  若没有则返回0,
	  若到达则返回非0

文件编程小demo,应用编程

标准输入再输出

#include <unistd.h>

int main(void)
{
	char buf[100]={0};
	read(0,buf,sizeof(buf));//从标准输入读数据
	write(1,buf,sizeof(buf));//把数据输出到标准输出
	return 0;
}

基于标准库实现类似于Linux下cat命令的功能

#include <stdio.h>

int main(int argc,char *argv[])//main函数的原型
{
	if(argc!=2){
		printf("your input is error!!!\n");   //判断命令行输入的参数
		return -1;
	}
	FILE *fp=NULL;              //定义文件流指针
	char readbuf[1000]={0};     //定义数据暂存空间
	fp=fopen(argv[1],"r");      //以只读方式打开文件
	if(fp==NULL)
	{
		printf("haven't this file!!!\n");
		return -1;
	}else{
		fread(readbuf,1,sizeof(readbuf),fp);   //从指定文件中断读取数据
		fwrite(readbuf,1,sizeof(readbuf),stdout);  //把数据输出到标准输出(屏幕)
	}
	fclose(fp);    //关闭文件流
	return 0;
}

基于系统调用实现CP指令

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

int main(int argc,char **argv)
{
	if(argc!=3)
	{
		printf("命令行输入的参数不正确!!!\n");   //判断命令行中输入的参数是否是三个./a.out file.txt newfile.txt
		return -1;
	}
	char *buf;   //定义一个指针,根据后面光标读取到是文件大小再配合malloc开辟合适的暂存数据内存空间
	int fd0;   //定义两个文件描述符
	int fd1;
	unsigned int file_len=0;  //存储文件大小
	fd0=open(argv[1],O_RDONLY);  //只读打开
	if(fd0<0)
	{
		printf("打开文件失败或没有该文件!!!\n");
		return -1;
	}else{
		fd1=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0600);//有此文件就覆盖,没有则创建
		if(fd1<0)
		{
			printf("创建%s失败!!!\n",argv[2]);
			close(fd0);
			return -1;
		}else{
			file_len=lseek(fd0,0,SEEK_END);    //利用光标移动计算文件大小
			printf("从%s中读取到%d的数据\n",argv[1],file_len);
			buf=(char*)malloc(sizeof(char)*file_len);  //开辟合适的内存空间
			lseek(fd0,0,SEEK_SET);  //还原光标
			read(fd0,buf,file_len);
			write(fd1,buf,file_len);
			close(fd0);  //关闭两个文件描述符
			close(fd1);
			free(buf);  //释放申请的内存空间
		}
	}
	return 0;
} 

修改config配置文件
假设有一个test.config文件的内容如下

/*
test.config    执行./a.out test.config (要修改的字段,如SPEED=)
SPEED=3
LENG=99
SCORC=9
LEVEL=7
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
        char *readbuf=NULL;
        char *mb=NULL;

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

        int fd0;
        fd0=open(argv[1],O_RDWR);
        if(fd0<0)
        {
                printf("Haven't the file!\n");
                exit(-1);
        }

        int len=lseek(fd0,0,SEEK_END);
        readbuf=(char*)malloc(sizeof(char)*len+8);
        lseek(fd0,0,SEEK_SET);

        int r_len=read(fd0,readbuf,len);

        char *p=(char*)malloc(strlen(argv[2])+8);
        mb=p;
        char p1;
        printf("data:");
        scanf("%c",&p1);     //输入修改的新值

        p=strstr(readbuf,argv[2]);
        if(p==NULL)
        {
                printf("No found %s!\n",argv[2]);
        }
        p+=strlen(argv[2]);
        *p=p1;

        lseek(fd0,0,SEEK_SET);

        int w_len=write(fd0,readbuf,strlen(readbuf));
        if(w_len>0)
        {
                printf("Write success!\n");
        }

        close(fd0);
        free(readbuf);
        free(mb);
        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值