第一章 1.2 标准IO相关库函数

文章目录


一、打开文件 --- fopen

函数原型

#include <stdio.h>

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

参数 :

        pathmane : 打开文件的文件名(包含路径),一般只写文件名,文件名相当于首地址

        mode : 打开文件的方式,如下:

                r : 以只读方式打开文件,文件必须存在

                r+ : 以读写方式打开文件,文件必须存在

                w : 以只写方式打开文件,如果文件不存在,则会先创建再打开
                w+ : 以读写方式打开文件,如果文件不存在,则会先创建再打开
                a : 以只写方式打开文件,如果要新加内容,则会另起一行开始写入,如果文件不存在,则会先创建再打开 
                a+ : 以读写方式打开文件,如果要新加内容,则会另起一行开始写入,如果文件不存在,则会先创建再打开              

                b : 以二进制流打开文件

返回值 :

        成功返回对应的文件的流指针,失败返回NULL,并且设置错误号(errno)

        

        errno : 当前系统中最后一个错误的编号

代码实现 :

#include <stdio.h>
#include <errno.h>
#include <string.h>
 
int main()
{
    FILE *fp = fopen("1.txt","r");//在当前目录下以只读的方式打开1.txt文件, fp :流指针
    if(NULL == fp)
    {
        //printf("errno = %d : %s\    n", errno, strerror(errno));
         perror("open 1.txt");
         return -1;
     }
     printf("fopen successful!  num = %d\n", fp->_fileno);//打印文件编号
 
    return 0;
}
//如果 1.txt 存在,结果为 :
fopen successful!  num = 3

//如果 1.txt 不存在,strerror 函数 :
errno = 2 : No such file or directory

//perror 函数 :
open 1.txt: No such file or directory

2. strerror 函数原型

#include <stdio.h>

char *strerror(int errnum);

参数 :

        errnum : 错误号

返回值 : 

        成功返回错误原因

3. perror 函数原型

 #include <stdio.h>

void perror(const char *s);

参数 :

        s : 提示信息

一般用 perror 函数提示错误,因为 strerror 函数需要添加  <string.h> 头文件,比起 perror 函数较麻烦。

二、关闭文件 --- fclose

函数原型

#include <stdio.h>

int fclose(FILE *stream);

参数 :
        stream : 关闭文件对应的流指针
返回值 :
        成功返回0,失败返回-1/EOF

        EOF是宏,值为-1

代码实现 :

#include <stdio.h>
#include <errno.h>
#include <string.h>
 
int main()
{
    FILE *fp = fopen("1.txt","r");//在当前目录下以只读的方式打开1.txt文件, fp :流指针
    if(NULL == fp)
    {
        //printf("errno = %d : %s\    n", errno, strerror(errno));
         perror("open 1.txt");
         return -1;
     }
     printf("fopen successful!  num = %d\n", fp->_fileno);//打印文件编号

    fclose(fp);
 
    return 0;
}

三、按字节读写文件

1. fgetc()

函数原型

#include <stdio.h>

int fgetc(FILE *stream);

参数 :
        stream : 流指针
返回值 :
        成功返回读取的字符,失败返回-1;
        读到文件末尾也会返回-1 

代码实现 :

#include <stdio.h>
 
int main()
{
    FILE *fp = fopen("1.txt", "r+");
    if(NULL == fp)
    {
        perror("open 1.txt");
        return -1;
    }
 
    char ch = fgetc(fp);//从文件中读取字符
    printf("ch = %c\n", ch);
 
    return 0;
}

2.fputc()

函数原型

#include <stdio.h>

int fputc(int c, FILE *stream);

参数 :
        c : 输入的字符
        stream : 流指针
返回值:
        成功返回写入的字符,失败返回-1; 

代码实现 :

#include <strings.h>

int main()
{
    FILE *fp = fopen("1.txt", "w+");
    if(NULL == fp)
    {
        perror("open");
        return -1;
    }

    char ch = fgetc(stdin);//从键盘输入字符

    int ret = fputc(ch, fp);//把键盘输入的字符写到文件中
    if(ret < 0)
    {
        perror("fputc");
        return -1;
    }

    return 0;
}

四、按行读写文件

1.fgets()

函数原型

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);

参数 :
        s : 字符串首地址
        size : 请求读取数据的最大长度
        stream : 流指针
返回值 :
        成功返回得到字符串的首地址,失败返回NULL;
注 :
        1. 当读取内容遇到换行符,读取结束
        2. 最大读取内容为 size-1 个

代码实现 :

#include <stdio.h>
int main()
{
    FILE *fp = fopen("1.txt", "r+");
    if(NULL == fp)
    {
        perror("open");
        return -1;
    }

    char buf[64] = {0};

    //fgets(buf, 64, stdin);//读到的内容放入buf缓冲区;64:最大输入64个字节;从键盘上读取
    fgets(buf, 64, fp);//从文件fp中读取
    printf("%s\n", buf);//输出读取到的字符  

    return 0;
}

 

结果:

1.txt内容如下:
hello
world

运行结果:
hello

//fgets函数遇到换行符读取结束

2.fputs()

函数原型

#include <stdio.h>

char *fputs(const char *s, FILE *stream);

参数 :
        s  : 字符串首地址
        stream : 流指针    
返回值 :
        失败返回-1;
注 :
        1.当读取内容遇到换行符,读取结束
        2.最大读取内容为 size-1 个

代码实现 :

#include <stdio.h>

int main()
{
    FILE *fp = fopen("1.txt", "w+");//w+:原文件中的内容会被新写入的内容完全覆盖,相当于自动清空
    if(NULL == fp)
    {
        perror("open");
        return -1;
    }
       
    char buf[64] = {0};
    fgets(buf, 64, stdin);
      
    int ret = fputs(buf, fp);//向fp文件中写入数据
    if(ret < 0)
    {
        perror("fputs");
        return -1;
    }

    return 0;
}

 

结果:

1.txt:
hello
world


运行结果:
终端显示:
world

1.txt:
world

五、按对象读写文件

1. fread()

函数原型 :

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参数 :
        ptr : 存放字符串的首地址
        size : 对象大小
        nmemb : 对象个数
        stream : 流指针
返回值 :
        成功返回读到的对象个数,失败返回0;

2. fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

参数 :
        ptr : 存放字符串的首地址
        size : 对象大小
        nmemb : 对象个数
        stream : 流指针
返回值 :
        成功返回读到的对象个数,失败返回0

六、刷新流 --- fflush

函数原型

#include <stdio.h>

int fflush(FILE *stream);

参数 :
        stream : 流指针
返回值 :
        成功返回0,失败返回-1

代码实现

#include <stdio.h>

int main()
{
    //如果没有fflush,则必须把文件字节大小占满才会显示内容
    printf("hello");

    fflush(stdout);//强制刷新,在循环时提前看到输出的内容

    while(1);

    return 0;
}       

七、文件定位 

函数原型

#include <stdio.h>

long ftell(FILE *stream);

功能 :
        返回文件指针相对于文件开头的偏移量
参数 :
        stream : 流指针
返回值 :
        成功返回文件指针相对于文件开头的偏移量,失败返回-1

int fseek(FILE *stream, long offset, int whence);

 参数:
        stream : 流指针
        offset : 偏移量,可正可负,正:往后偏;负:往前偏
        whence : 基准点
            SEEK_SET : 将文件指针定位在文件开头
            SEEK_CUR : 将文件指针定位在当前位置
            SEEK_END : 将文件指针定位在文件末尾

最终定位位置 = offset + whence


    返回值 :
        成功返回0,失败返回-1

代码实现:文件中字符的偏移

#include <stdio.h>
int main()
{
    FILE *fp = fopen("1.txt", "r+");
    if(NULL == fp)
    {
        perror("open");
        return -1;
    }

    fseek(fp, 6, SEEK_SET);//偏移量为6

    char ch = fgetc(fp);//从fp中读取字符,存储到ch中
    printf("ch = %c\n", ch);打印偏移到的字符

    return 0;
}
               

 

1.txt中的内容:
hello world


运行结果:
w
void rewind(FILE *stream);

 功能 :
        将文件指针定位在文件开头

八、判断错误流

函数原型

#include <stdio.h>

int feof(FILE *stream);

返回值 :
        1--流访问结束
        0--错误返回

总结

以上就是标准IO部分相关的函数介绍以及部分函数功能实现的例子,欢迎参考指正!

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值