Linux 系统编程 文件部分(open、write、read、close、lseek(光标)、creat(创建)、查找并修改p = strstr(fd,“LENG=“)FILE * fp=fopen

and fopen、fwrite、fread、fseek、fputc、fclose、fgets、feof、

gcc 命令:用来编译C和C++文件-c 编译、汇编而不链接
-S 编译而不进行汇编和链接
-E 预处理
-v 同时显示编译器的代码
-o<文件> 将输出输入到指定文件
-x<语言> 指定语言
--help 显示帮助信息
--version 显示版本信息

grep “ xxx” *  字符串查找

open 函数

 fd = open("./file1",O_RDWR|O_CREAT,0600); 

fd = open("./file1",O_RDWR|O_CREAT|O_EXCL);-----出错 返回-1                                                

fd = open("./file1",O_RDWR|O_APPEND);---写入数据在尾部追加,

fd = open("./file1",O_RDWR|O_TRUNC);------重头开始 完全覆盖。

#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 = "yanglang henshuai!!";

        fd = open("./file1",O_RDWR);//打开文件
        if(fd == -1)
        {
                printf("open creat failure\n");
                fd = open("./file1",O_RDWR|O_CREAT,0600);//没有该文件就创建
                if(fd > 0)
                {
                        printf("open creat succeed\n");
                }
        }

        printf("creat succeed fd:%d\n",fd);
//      size_t write(int fd, const void *buf, size_t count);
        int n_write = write(fd,buf,strlen(buf));//写入文件
        printf("n_write = %d\n",n_write);

//       off_t lseek(int fd, off_t offset, int whence);
        lseek(fd,-19,SEEK_END);                //光标移动到起始位置SEEK_SET/END/CUR起始尾巴当前位置

        char *readBuf;
        readBuf = (char*)malloc(sizeof(n_write+1));//强转成char* 指针开辟空间
//       ssize_t read(int fd, void *buf, size_t count);
        int n_read = read(fd,readBuf,n_write);    //读取内容存放在 readBuf中 打印出来
        printf("n_read = %d\n",n_read);
        printf("readBuf:%s\n",readBuf);
        return 0;
}

 光标函数  lseek(fd,0,SEEK_SEK/CUR/END)光标在头/当前位置/尾巴

 

 

fd =  creat("/home/CLC/demo/new",S_IRWXU/r/w/x); 创建并打开 写或者读

 标准输入0、标准输出1、标准错误2  相当于scanf和printf

 

#include <stdio.h>
int main(int argc,char **argv)//传参数 几个 数组的数组二级指针
{
        printf("argc=%d\n",argc);        //个数
        printf("argv[0]=%s\n",argv[0]);  //a.out
        printf("argv[1]=%s\n",argv[1]);  //Src
        printf("argv[2]=%s\n",argv[2]);  //Des
        return 0;
}

 用光标计算大小后在开辟空间------打开argv1 读取数据放在buf中 打开argv2 把buf中数据写入

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


int main(int argc,char **argv)
{
        int fdSrc;
        int fdDes;
        char *readBuf = NULL;

        if(argc != 3)        //是不是三个参数
        {
                printf("error\n");
                exit(-1);
        }

        fdSrc = open(argv[1],O_RDWR,0600);//打开argv[1]
//       off_t lseek(int fd, off_t offset, int whence);
        int size = lseek(fdSrc,0,SEEK_END);//光标计算文件偏移多少个 即文件大小
        lseek(fdSrc,0,SEEK_SET);            //光标回到头 
        readBuf = (char *)malloc(sizeof(char)*size +8);//开辟合适大小空间

//       ssize_t read(int fd, void *buf, size_t count);
        int n_read = read(fdSrc,readBuf,size);        //数据读取到readBuf的数组中


        fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);//打开argv[2]且用O_TRUNC清空
//       ssize_t write(int fd, const void *buf, size_t count);
        write(fdDes,readBuf,strlen(readBuf));        //把readBuf中的数据写入到argv[2]中

        close(fdSrc);//关闭文件 防止损坏
        close(fdDes);
        return 0;
}

 查找并修改

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

//       off_t lseek(int fd, off_t offset, int whence);


int main(int argc,char **argv)
{
        int fdSrc;
        char *readBuf = NULL;

        if(argc != 2)        //判断是不是两个
        {
                printf("error\n");
                exit(-1);
        }

        fdSrc = open(argv[1],O_RDWR|O_CREAT,0600);//打开计算利用光标计算内容多大
        int size = lseek(fdSrc,0,SEEK_END);
        lseek(fdSrc,0,SEEK_SET);
        readBuf = (char *)malloc(sizeof(char)*size + 8);
        int n_read = read(fdSrc,readBuf,size);    //把内容读到readBuf中

//       char *strstr(const char *haystack, const char *needle);
        char *p = strstr(readBuf,"LENG=");//strstr返回首地址
        if(p == NULL)                    //判断是否找到
        {
                printf("not find\n");
                exit(-1);
        }
        p = p + strlen("LENG=");        //地址偏移
        *p = '5';                        //偏移后替换 修改内容
        lseek(fdSrc,0,SEEK_SET);        //光标又回到起点
        write(fdSrc,readBuf,strlen(readBuf));//把修改后的内容重新写入该文件中完成修改

        close(fdSrc);

        return 0;
}

 open文件 (取地址、指针)写入单个字符数字、结构体或者结构体数组

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

typedef struct
{
        int data;;
        char a;
}Test;

int main()
{

        Test t1[2] = {{100,'a'},{101,'b'}};//结构体数组
        Test t2[2];            

        int fd = open("./file1",O_RDWR|O_CREAT,0600);//打开文件 把结构体的内容取地址 写进去
        write(fd,&t1,sizeof(Test)*2);    //注意取地址  大小内结构体大小*2
        lseek(fd,0,SEEK_SET);                        //写完 光标移动到开始位置

        read(fd,&t2,sizeof(Test)*2);                 //把文件里的内容读取到结构体数组2中
        printf("t2:data=%d  a=%c\n",t2[0].data,t2[0].a);//打印出来
        printf("t2:data=%d  a=%c\n",t2[1].data,t2[1].a);
        close(fd);                            //关闭文件
        return 0;
}

 标准c库创建文件、读取文件、光标移动    grep查找

 

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

int main()
{
        char *str = "yang lang good luck!!";
        char buf[128] = {0};
//       FILE *fopen(const char *path, const char *mode);
        FILE *fp = fopen("./yanglang_Fopen.txt","w+");//打开文件 "w+"可读可写没有并创建

//       size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
        fwrite(str,sizeof(char)*strlen(str),1,fp);//写入内容、长度。次数、文件描述符
        printf("fwrite: xie ru cheng gong\n");
//     nt fseek(FILE *stream, long offset, int whence);
        fseek(fp,0,SEEK_SET);                    //光标偏移到初始位置

//  size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        fread(buf,sizeof(char)*strlen(str),1,fp);//内容读取出来到buf
        printf("fread: %s\n",buf);
//       int fclose(FILE *fp);
        fclose(fp);                            //关闭文件
        return 0;
}
//读和写的第三个参数是返回值n_write/n_read、n_read以实际返回个数为准

 fputc用法

 feof 、fgetc用法   feof找到最后返回1 否则返回0

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

int main()//写进文件夹
{
        FILE *fp;                    //文件类型
        char *str = "hello world!!";
        int len = strlen(str);
        int i = 0;

        fp = fopen("./test.txt","w+");//打开或创建这个可读可写的文件
        for(i=0;i<len;i++){        
                fputc(*str,fp);        //把指针字符串内容一个个写入到fp指向的文件中
                str++;                //指针偏移字符串次数
        }

        fclose(fp);                    //关闭文件夹
        return 0;
}

int main()                               //读取文件夹
{
        FILE *fp;
        char c;

        fp = fopen("./test.txt","r");    //以只读方式打开文件夹
        while(!feof(fp)){     //feof作用 没偏移到字符串尾部返回0 偏移到字符串返回1 所以取反
                c = fgetc(fp);    //每次获取一个字符 赋给C并打印出来
                printf("%c",c);
        }
        fclose(fp);
        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值