(2)Linux基础——fopen/fclose、fputc/fgetc、fputs/fgets、fread/fwrite、fscanf/fprintf详细含义用法介绍(基础)

C语言文件操作详解:fopen,fclose及常用函数
该文详细介绍了C语言中对文件进行读写操作的基本函数,包括fopen用于打开文件,fclose用于关闭文件,fputc/fgetc用于字符输入输出,fputs/fgets用于字符串输入输出,fread/fwrite用于二进制数据的读写,以及fscanf/fprintf用于格式化字符串的读写。文章通过示例代码阐述了各函数的使用方法和参数含义。

一、整体操作步骤

1.打开文件:fopen

2.读写文件:

fgetc/fputc :单个字符的输入输出,输入输出为ASCII码文件

fgets/fputs: 字符串的输入输出,输入输出为ASCII码文件

fread/fwrite 二进制数据的输入输出 ,输入输出为二进制文件/ASCII码文件

fscanf/fprintf:格式化字符串的输入输出,输入输出为ASCII码文件

3.关闭文件:fclose

二、fopen/fclose

fopen:

①函数原型:FILE *fopen(const char *pathname, const char *mode);

②功能:打开一个文件并与之建立交流

③参数:

pathname:打开文件的路径

mode:打开文件的方式

"r"只读

文件不存在—报错

文件存在—只读打开

"r+"

文件不存在—报错

文件存在—读写打开

"w"

文件不存在—创建,将所输入的内容填写到文件中

文件存在—内容全部清零,只读方式打开

"w+"

文件不存在—创建,将所输入的内容填写到文件中

文件存在—内容全部清零,读写方式打开

"a"

文件不存在—创建,将所输入的内容填写到文件中

文件存在—打开后面跟着直接写

"a+"

文件不存在—创建,将所输入的内容填写到文件中

文件存在—打开后面跟着直接读写

④返回值:成功返回FILE类型指针,失败返回NULL

eg:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp =NULL;

    fp = fopen("a.txt","w");//只读的方式打开
    if (fp ==NULL)
    {
            perror("faile to open");
            return -1;
    }
    fputs("hello world",fp);//向文件输入"hello world"
    fclose(fp);
    return 0;
}

输入结果:创建了一个a.txt,内容"hello world"

fclose:

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

②功能: 关闭流

③参数:stream:流

④返回值:成功返回0,失败返回EOF(-1)

fclose(fp)

fopen打开的文件,最后要用fclose关闭,否则会出现内存泄漏

三、fputc/fgetc

fputc:

①函数原型:int fputc(int c, FILE *stream);

②功能:将c对应的字符ASCII码值写入流中

③参数:c为字符的ASCII码值,stream为文件流指针

④返回值:成功返回输入字符ASCII码值,失败返回EOF

eg:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp =NULL;

    fp = fopen("a.txt","w");
    if (fp ==NULL)
    {
            perror("faile to open");
            return -1;
    }
    fputc('h',fp);
    fputc('o',fp);
    fputc('w',fp);
    fputc(' ',fp);
    fputc('a',fp);
    fputc('r',fp);
    fputc('e',fp);
    fputc(' ',fp);
    fputc('y',fp);
    fputc('o',fp);
    fputc('u',fp);

    fclose(fp);
    return 0;
}

输入结果:

fgetc:

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

②功能:从流中获得一个字符

③参数:stream为文件指针流

④返回值:成功读取字符的ASCII码值,失败或者读到末尾返回EOF

eg:读取上一个a.txt文件内容"how are you"

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp =NULL;
    char ch = 0;

    fp = fopen("a.txt","r");//注意:是r 只读模式
    if (fp ==NULL)
    {
            perror("faile to open");
            return -1;
    }
    while(1)//字符的遍历,进行循环检查文件a.txt是否读完
    {
        ch = fgetc(fp);
        if(   EOF == ch  ) //如果没有字符EOF,则跳出循环
        {
            break;
        }
        printf("%c\n",ch);//输出所读到的字符
    }

    fclose(fp);
    return 0;
}

输出结果:

四、fputs/fgets

fputs:

①函数原型: int fputs(const char *s, FILE *stream);

②功能:s指向的字符串写入流中,不包含/0字符

③参数:s:要写入字符串的首地址 stream:文件流指针

④返回值:成功返回非负数,失败返回EOF

eg:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp =NULL;
    char ch = 0;
    char a[32] = {"what are you doing"};
   
    fp = fopen("a.txt","w");
    if (fp ==NULL)
    {
            perror("faile to open");
            return -1;
    }
   
    fputs("hello world",fp);
    fputs(a,fp);

    fclose(fp);
    return 0;
}

输入结果:

fgets:

①函数原型:char *fgets(char *s, int size, FILE *stream);

②功能:向流中输入字符串

③参数:s:存放字符串空间首地址 size:最多存放字符串的个数 stream:文件流指针

④返回值:成功返回存放字符串空间的首地址,失败或读到文件末尾返回NULL

⑤注意:

1.fgets最多读取一行字符串

2.fgets想要读取的字符串<这一行字符串长度,会读取前size-1个字符

3.fgets会存储\n字符

4.fgets会在最末尾补\0

eg:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp =NULL;
    char *p = NULL;
   char ch[32] = {0};

    fp = fopen("a.txt","r");
    if (NULL == fp )
    {
            perror("faile to open");
            return -1;
    }
   
   while (1)
   {
        p = fgets(ch,sizeof(ch),fp);
        if(NULL == p)
        {
            break ;
        }
        printf("%s\n",ch);
   }

    fclose(fp);
    return 0;
}

输出结果(提前创建a.txt其内容为 hello world clear):

五、fread/fwrite

fread:

①函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

②功能:从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中

③参数:ptr:存放对象存放空间的首地址 size:读取对象的字节数 nmemb:读取对象的个数

stream:文件流指针

④返回值:成功返回实际读到对象的个数,失败或读到文件末尾返回0

eg:(对应fwrite eg2的例子

#include <stdio.h>

typedef struct student 
{
    char name[32];
    char sex;
    int age;
    int score;
}stu_t;

int main(int argc, char const *argv[])
{
    FILE *fp = NULL;
    stu_t s;
    stu_t stu[5];
    size_t ret = 0;
    int i = 0;

    fp = fopen("a.txt", "r");
    if (NULL == fp)
    {
        perror("fail to fopen");
        return -1;
    }

    ret = fread(&s, sizeof(stu_t), 1, fp);
    printf("==============================\n");
    printf("ret = %ld\n", ret);
    printf("姓名:%s\n", s.name);
    printf("性别:%c\n", s.sex);
    printf("年龄:%d\n", s.age);
    printf("成绩:%d\n", s.score);

    ret = fread(stu, sizeof(stu_t), 5, fp);
    printf("==============================\n");
    printf("ret = %ld\n", ret);
    for (i = 0; i < ret; i++)
    {
        printf("姓名:%s\n", stu[i].name);
        printf("性别:%c\n", stu[i].sex);
        printf("年龄:%d\n", stu[i].age);
        printf("成绩:%d\n", stu[i].score);
    }

    printf("==============================\n");
    ret = fread(stu, sizeof(stu_t), 5, fp);
    printf("ret = %ld\n", ret);

    fclose(fp);

    return 0;
}

输出结果:

fwrite:

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

②功能:向流中写入nmemb个对象,每个对象size个字节,写入数据存放在ptr所指向的空间中

③参数:ptr:写入对象存放空间的首地址 size:写入对象的字节数 nmemb:写入对象的个数

stream:文件流指针

④返回值:成功返回写入对象的个数,失败返回0

eg1:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp = NULL;
    char ch[11] = {"hello world"};
    char *x = NULL;
    x =ch;

    fp = fopen("a.txt","w");
    if(fp == NULL)
    {
        perror("fail to open");
        return -1;
    }

    fwrite(x,sizeof(ch),1,fp);
    
    fclose(fp);
    return 0;
}

输入结果:

eg2:

#include <stdio.h>

typedef struct student 
{
    char name[32];
    char sex;
    int age;
    int score;
}stu_t;

int main(int argc, char const *argv[])
{
    FILE *fp = NULL;
    stu_t s = {"zhangsan", 'm', 19, 100};
    stu_t stu[3] = {
        {"zhangsan", 'm', 18, 90},
        {"lisi", 'f', 19, 85},
        {"wanger", 'm', 16, 70},
    };

    fp = fopen("a.txt", "w");
    if (NULL == fp)
    {
        perror("fail to fopen");
        return -1;
    }

    fwrite(&s, sizeof(s), 1, fp);
    fwrite(stu, sizeof(stu_t), 3, fp);

    fclose(fp);

    return 0;
}

输入结果:

六、fscanf/fprintf

fscanf:

①函数原型:int fscanf(FILE *stream, const char *format, ...);

②功能:从流中接收格式化字符串

③参数:stream:文件流指针 format:接收数据格式 ...:存放数据对应的变量空间

④返回值:正常返回匹配到的输入控制符的个数,出错或读到文件末尾返回EOF

eg:

提前创建a.txt,并输入a=100,b=200

输入代码:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp =NULL;
    int num1 = 0;
    int  num2 = 0;

    fp = fopen("a.txt","r");
    if (fp ==NULL)
    {
            perror("faile to open");
            return -1;
    }
   
    fscanf(fp, "a=%d, b=%d", &num1, &num2);

    printf("num1=%d\n",num1);
    printf("num2=%d\n",num2);
    
    fclose(fp);
    return 0;
}

输出结果:

fprintf:

①函数原型:int fprintf(FILE *stream, const char *format, ...);

②功能:将格式化字符串写入流中

③参数:stream:文件流指针 format:写入文件中数据的格式 ...:对应的变量

④返回值:成功返回打印字节数,失败返回负数

eg:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp =NULL;
    char *p = NULL;
    int a = 100;
    int b = 200;

    fp = fopen("a.txt","w");
    if (fp ==NULL)
    {
            perror("faile to open");
            return -1;
    }
   
     fprintf(fp,"hello world\n");
     fprintf(fp,"a= %d b = %d a+b = %d ",a,b,a+b);

    fclose(fp);
    return 0;
}

输入结果:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值