Linux文件编程(标准C库)

常用:fopen,fseek,fwrite,fread,feof,fclose

 其他:fputc,fgetc

标准c库的fopen和open的区别:

具体可参考:https://www.cnblogs.com/NickyYe/p/5497659.html

1.

open:UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。

fopen:ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。

2.open应用于UNIX系统,因此有一定的局限性,fopen源于标准c库,用c语言编写的代码环境下都能用,移植性好

3.open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。

fopen是用来操纵普通正规文件(Regular File)的。

4.如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。

5.fopen有缓冲区,能在缓冲区中完成相应操作能更少依赖内核和用户的切换,open通过类似于指令的方式与内核进行对话操作文件速度有一定影响

fopen

原型:FILE *fopen(const char *filename, const char *mode); 

const char *filename 参数 : 文件名 ;

const char *mode 参数 : 文件的打开方式 ;

文件打开方式的参数:

"r"           打开文字文件只读
"w"           创建文字文件只写
"a"           增补, 如果文件不存在则创建一个
"r+"          打开一个文字文件读/写
"w+"          创建一个文字文件读/写
"a+"          打开或创建一个文件增补
"b"           二进制文件(可以和上面每一项合用)
"t"           文这文件(默认项)

示例代码 

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

int main()
{
        FILE *p = fopen("./frAw.txt","w+");
        printf("open success!\n");
        return 0;
}

 

fseek 

和lseek的用法一样

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

参数介绍:

                fd为文件的对应值

                offset为偏移量

                whence可以选择:SEEK_SET(光标回到行首),SEEK_CUR(光标在当前下标),SEEK_END(光标到行末)

 

 fread 

 函数原型:

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

void *buffer  : 将文件中的二进制数据读取到该缓冲区中 ;

size_t size 参数 : 读取的 基本单元 字节大小 , 单位是字节 , 一般是 buffer 缓冲的单位大小 ;

  • 如果 buffer 缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;
  • 如果 buffer 缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;

size_t count 参数 : 读取的次数

FILE *stream 参数 : 文件的指针

size_t 返回值 : 读取的次数

fwrite

 函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

参数说明:

const void *ptr : 读出数据存放的地方

size_t size : 要写出数据的 基本单元 的字节大小 , 写出单位的大小 ;

size_t nmemb : 要写出数据的读出次数;

FILE *stream : 要读的文件的指针;


返回值 : size_t 返回值返回的是读出次数

示例代码

将字符串写入文件,并从文件读出字符串

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

int main()
{
        char *str="xwd yyds!";
        char buf[64]={0};
        FILE *p = fopen("./frAw.txt","w+");
        fwrite(str,sizeof(char),strlen(str),p);
        fseek(p,0,SEEK_SET);
        fread(buf,sizeof(char),strlen(str),p);
        printf("read info:%s\n",buf);
        return 0;
}

 

 同时不仅能写入读出字符串还能写入读出其他的内容,下面以结构体为例

 示例代码

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

struct Student{
        char name[15];
        int age;
};
int main()
{
        struct Student s1={"xiaoming",18};
        struct Student s2;
        FILE *p = fopen("./frAw2.txt","w+");
        fwrite(&s1,sizeof(struct Student),1,p);
        fseek(p,0,SEEK_SET);
        fread(&s2,sizeof(struct Student),1,p);
        printf("s2 info:%s,%d",s2.name,s2.age);
        fclose(p);
        return 0;
}

 

执行成功后查看文件内容可能会出现乱码,因为文本以字符串方式记载

feof

函数原型:int feof ( FILE * stream );

 FILE * stream :文件指针

功能:判断是文件内容是否结束(结尾)

                结束前返回0,内容结束后面没内容,返回1

 

fputc 

函数原型:int fputc(int char, FILE *stream)

int char :字符

参数FILE *stream :文件的指针

一般通过指针移动写入文件的内容

示例代码

 

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

int main()
{
        FILE *fp = fopen("./fputc.txt","w+");
        char *str = "xwd yyds!!";
        int i;
        int len = strlen(str);
        for(i=0;i<len;i++)
        {
                fputc(*str,fp);
                str++;
        }
        fclose(fp);
        return 0;
}

 

 

 

fgetc

 函数原型:int fgetc(FILE *stream) 

参数FILE *stream :文件的指针

一般通过指针移动获取文件的内容

示例代码 

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

int main()
{
        FILE *fp = fopen("./fputc.txt","r");
        char c;
        while(!feof(fp))
        {
             c = fgetc(fp);
             printf("%c",c);
        }
        fclose(fp);
        return 0;
}

 

 

 


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值