欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

0基础自学C语言视角:标准IO_fopen( )、fclose()

程序员文章站 2023-08-21 18:26:45
思前想后一个月,我终于敲下了我的第一篇开山之作。 博客千千万,我的博客首先记录的是学习时候的理解,用于给自己翻阅查找,现在主要研究的是C语言和STM32。如果能帮到你,那是最好的,假如我写的东西有错误欢迎指正,所以请反复对比,仅作参考。其次,这里不仅记录学习,也会写下我在朋友圈不能公开的想法和秘密! ......

思前想后一个月,我终于敲下了我的第一篇开山之作。

博客千千万,我的博客首先记录的是学习时候的理解,用于给自己翻阅查找,现在主要研究的是c语言stm32。如果能帮到你,那是最好的,假如我写的东西有错误欢迎指正,所以请反复对比,仅作参考。其次,这里不仅记录学习,也会写下我在朋友圈不能公开的想法和秘密!

马上进入主题


一、什么是文件?

  我相信,就算接触过c语言的文件输入输出的人,还会回答:文件不就是鼠标点击的东西嘛!其实不全对,因为在c语言程序中,文件有着更广泛的定义:文件通常是在磁盘或硬盘上的已命名的储存区。

要看到是通常,那么就说明会有不寻常的。对于c程序来说,设备也可以看成是文件!例如屏幕和键盘。看到这里的朋友会有一个疑问:那么c程序和语言有什么关系呢?文件对c程序有什么重要性呢?

简单地理解,文件能够输入一些必要的数据给程序使用以及程序输出数据到文件保存。

0基础自学C语言视角:标准IO_fopen( )、fclose()

 

  1.1  文件的两种形式

  在c程序看来,文件只有两种形式。

  •   文本文件
  •        二进制文件 

文本文件即里面的数据都是字符。 字符传化成对应的ascii码存放在内存中。如“abc”就分别是‘a’、'b'、'c'存放

二进制文件即里面的数据直接存放在内存中。无需转换为ascii码,可以理解为机器语言(只有0和1)。例如整数1000转换为二进制为‭0010 0111 0001 0000‬,直接存储在内存中。

二、利用标准io操作文件

  2.1  标准io(standard high-level i/0)是什么

    标准io是标准i/o是ansi c建立的标准函数包和stdio.h头文件中的定义。通俗的来讲就是一些操作io的库函数,至于是怎么实现的我也不知道。今天我们来讲三个函数:fopen(),  fclose().

分别对应着打开文件、关闭文件两个功能。

    其次,与标准io对应着的还有文件io或者叫底层io(low-level i/o)。暂时不需要关心。

  2.2  标准文件

    一开始提到,一些设备都被c程序看做是文件。所以c语言定义了三个标准文件:标准输入(standard input)标准输出(standard output)标准错误输出(standard error output).

分别对应着键盘屏幕屏幕。但是,标准错误输出强制性输出到屏幕(即使重定向到其他文件啦显示错误信息)。看到这里看不懂没关系,我们结合下面的函数讲解就懂了。

标准文件和对应文件指针
标准文件 文件指针 通常使用的设备
标准输入 stdin 键盘
标准输出 stdout 显示器  
标准错误输出 stderr 显示器

 

文件指针是即将要讲到函数里面的c语言里一个特殊的指针。

 

 

 

 

 

三、  fopen()  

函数介绍:

打开或创建一个文件并且返回一个文件指针。

函数原型:

 

file *fopen(const char *path, const char *mode);

 file为一个结构体 但是这个结构体太复杂,暂时不需要弄清楚。

 

 

 函数详解:

参数1const char *path ,这是一个指针,char表明指向的是一个字符串,const表明不能通过path指针变量去修改这个字符串。

  这个字符串指定了你要准备打开或创建的文件路径和名称,例如“我好饿啊.txt”

参数2:设置打开的模式。可输入的参数有如下:

模式 含义
“r” 只能读
“w” 只能写,无此文件则创建,有此文件则清空
“a” 只能写,会在原来的文件后面添加内容。无此文件则创建文件
“r+” 读写文件
“w+” 读写文件,无此文件则创建,有此文件则清空
“a+” 读写文件,会在原来的文件后面添加内容。无此文件则创建文件

上述打开的都是文本本件

此外还有"rb", "wb", "ab", "r+b", "w+b", "a+b",此时打开二进制文件。

path 参数可以是相对路径(../fishc.txt)也可以是绝对路径(/home/fishc/fishc.txt),如果只给出文件名而不包含路径,则表示该文件在当前文件夹中

 

 

 

 

返回值:

1. 如果文件打开成功,则返回一个指向 file 结构的文件指针;

2. 如果文件打开失败,则返回 null 并设置 errno 为指定的错误。

 举例子:

    file *fp;                //定义一个文件指针
    fp=fopen("c语言数据.txt","r")     //以只读的方式打开文本文件,并返回一个文本指针给fp

然后我们接下来就可以通过fp去操作文件,至于怎么实现不用管。可以理解为fp现在就指向了一个实际的txt文件。

而且,我们可以用过改变第二个参数感受一下他们之间的区别。

四、fclose()

函数介绍:

关闭文件先前用fopen()打开的文件

关闭后会把缓冲区的数据送到程序或者文件(要看先前对文件的操作是读取文件数据还是输出数据到文件)

函数原型:

    int fclose(file *fp);

函数详解:

参数:是一个文件指针,指向要关闭的文件。例如先前通过fopen()把创建的文件给了fp,现在fp则代表着这个文件,操作fp即可关闭文件。

返回值:

1. 如果文件关闭成功,返回值是 0;

2. 如果文件关闭失败,返回值是 eof,并设置 errno 为指定的错误。

 

记得操作完文件之后要用fclose(),因为调用了fclose函数才能把缓冲区的数据送到指定的地方。fopen和fclose最好同时使用。

 

    接下来我还会继续讲我对缓冲区和流的理解哦,以及fflush函数及其相关代码例子。敬请期待!