Linux 文件编程(第三阶段 标准C库对文件操作)

13.标准C库对文件操作引入

linux 和标准C库文件操作对比:
https://www.cnblogs.com/NickyYe/p/5497659.html

14.标准c库打开创建文件读写文件光标移动

在这里插入图片描述
fopen,fwrite,fread代码使用方式(demo19.c)

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

int main()
{
        //FILE *fopen(const char *pathname, const char *mode);

        FILE *fp;
        char *str = "chenLiChen hen shuai";
		char readBuf[128] = {0};
		
        fp = fopen("./chen.txt","w+");//*注意这里第二个参数是字符串因为是指针所以用字符串形式

        //size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
        //ptr buf   要写的数据的缓存(第一个参数)
        //size sizeof char(数据的长度)
        //geshu 写几个(有时写1就是一个字符串写入)
        //which file 在哪个文件操作
        fwrite(str,sizeof(char),strlen(str),fp);//一个字节一个字节的写入
         //fwrite(str,siazeof(char)*strlen(str),1,fp);字符串写入一次性写那么多
        fseek(fp,0,SEEK_SET);
        //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        fread(readBuf,sizeof(char),strlen(str),fp);//这里是多次字节的读
		//fread(readBuf,sizeof(char)*strlen(str),1,fp);(就修改了一次性读这个函数,在demo20.c)
        printf("read data: %s\n",readBuf);
        return 0;
}
~   

运行结果图(chen.txt创建成功没有截图)
在这里插入图片描述

15.标准c库写入结构体到文件

补充上节课的内容(demo21.c):

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

int main()
{

        //FILE *fopen(const char *pathname, const char *mode);

        FILE *fp;
        char *str = "chenLiChen hen shuai";
        char readBuf[128] = {0};

        fp = fopen("./chen.txt","w+");

        //size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
        //ptr buf
        //size sizeof char
        //geshu 
        //which file
        int nwrite = fwrite(str,sizeof(char),100,fp);//注意:write和read函数的返回值不是和写入多少个实际值有关,其大小取决与第三个形参的值,这个参数多大,返回值就多大,如下图截图可视。
        //fwrite(str,siazeof(char)*strlen(str),1,fp);
        fseek(fp,0,SEEK_SET);
        //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        int nread = fread(readBuf,sizeof(char),strlen(str),fp);//read的话其返回值大小是取决于第三个参数,但是它的第三个个数不能大于write的个数,如果大于write的个数其返回值也只能最大等于write的返回值(demo22.c可看)。

        printf("read data: %s\n",readBuf);
        printf("n_read:%d , nwrite:%d\n",nread,nwrite);

        return 0;
}

这是以上代码运行的结果:
在这里插入图片描述
把结构体写入文件(demo23.c)

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

struct Test
{
        int a;
        char c;
};

int main()
{
        FILE *fp;

        struct Test data = {100,'a'};
        struct Test data2;

        fp = fopen("./file1","w+");

        int n_write = fwrite(&data,sizeof(struct Test),1,fp);//这里就不能像前面写字符串一样拆开写了,是要结构体整体一次性写入,第三个参数写一次,因为就一个结构体。

        fseek(fp,0,SEEK_SET);

        int n_read = fread(&data2,sizeof(struct Test),1,fp);

        printf("read %d,data=%d,char=%c\n",n_read,data2.a,data2.c);
        fclose(fp);

        return 0;

}

下图是运行看结果:
在这里插入图片描述

16.文件其它函数讲解及文件收尾

fputc 用法(demo24.c):

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

int main()
{
        FILE *fp;
        int i;
        char *str = "zhanglong hen shuai a!";
        int len;
        len = strlen(str);//这里不直接用strlen(str)直接放在for那,是因为每次循环再计算的时候str++会影响到,所以用len先赋值。注意这些细节

        fp = fopen("./test.txt","w+");

        for(i=0;i<len;i++){
                fputc(*str,fp);//fputc一次只能写一个字符给文件,所以用循环语句写操作。
                str++;
        }

        fclose(fp);

        return 0;
}

下图是运行结果(test.txt文件成功被写入):
在这里插入图片描述
feof 用来判断是否到达文件尾,如果没有到达文件尾巴,这个函数的返回值为0,到达文件尾巴就变成0了;fgetc(fp)就只需要一个文件描述符传参,返回值是读到的数据。

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

int main()
{
        FILE *fp;
        char c;

        fp = fopen("./test.txt","r");

        while(!feof(fp)){//这里判断是个细节,feof读到不是尾巴的时候返回值是0,那么就不可能执行while的循环,所以取反,当到达尾巴是非0,取反变成0,跳出循环。
                c = fgetc(fp);
                printf("%c",c);
        }
        fclose(fp);

        return 0;
}

上面的实际当中fputc、feof、fgetc用的比较少,多了解一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值