十 一、I/O操作之库函数(一)

本文介绍了C语言中的库函数,特别是用于文件操作的基础函数,包括fopen、fread、fwrite、fseek和fclose的使用方法。通过示例详细讲解了如何使用这些函数进行文件读写、文件指针定位以及文件关闭。此外,还提供了两个实践例子,分别是将用户输入数据存入文件并显示,以及利用库函数实现文件拷贝功能。
摘要由CSDN通过智能技术生成

Linux上一切皆文件,我们现在来学习如何处理文件,处理文件有两种方式,一种是利用库函数,一种是系统调用,那我们首先来学习一下库函数。

一、库函数基础概念

1. 库函数:库函数(Library function)是把函数放到库里,供别人使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。调用的时候把它所在的文件名用#include<>加到里面就可以了。一般是放到lib文件里的。不受平台限制。
2. 流:对于标准的C函数库,文件操作都是围绕着流来进行的,流是一个抽象的概念,当程序需要读取数据的时候,开启一个通向数据源的流,数据源可以是文件,内存,网络连接等;当程序需要写入数据时,开启一个通向目的地的流,如下图:
在这里插入图片描述
3. 缓冲区: 库函数对文件处理时设置缓冲区,即在程序执行时,会提供额外的内存,来暂时存放文件中的数据,避免多次和内核交互。注意,在实际编程中,这个缓冲区是隐式的,并不会被编程人员显示获取。
那么当我们使用标准I/O函数,即在#include<stdio.h>中的C库函数时,系统会自动设置缓冲区:

  • 通过数据流来读写文件,那么当对文件进行读取时,不会直接操作作为源头的物理空间(如磁盘),而是打开数据流,将源头上的文件信息拷贝到缓冲区中,然后程序再从缓冲区中读取所需数据。
    在这里插入图片描述
  • 当写入文件时,也并不会马上就写入终点物理空间(如磁盘等),而是先写入缓冲区,只有在缓冲区满或者关闭文件时,才会将缓冲区的数据写入终点,如下图:
    在这里插入图片描述

4. 文件指针: 用库函数的方式访问文件,用FILE类型表示一个打开的文件,这个类型中包含管理文件流的信息,我们将指向该类型的指针FILE*称为文件指针。借用该指针可以对它指向的文件进行操作。

5. 文件类型: 文本类型和二进制,b就表示二进制文件。

二、基础文件操作函数

那下面我们介绍基础的文件操作:

(一)fopen

fopen()表示打开一个文件,这是文件操作的第一步。函数原型如下:

FILE fopen(const char path,const char* mode)**

参数说明:

  • const char* path:表示打开文件路径和文件名,如果在同一目录下,那么只写文件名即可,不在同一目录下需要写绝对路径加文件名。
  • const char* mode:表示打开文件的方式,可以取值如下:
参数 含义
r 只读方式打开,文件必须存在,否则出错
r+ 可读写,文件必须存在
rb+ 以读写方式打开二进制文件
rt+ 以读写方式打开文本文件
w 只写,文件存在则覆盖,不存在建立该文件
w+ 可读写,文件存在则覆盖,不存在建立该文件
wb 只写方式打开二进制文件
w+ 可读写,文件存在覆盖,不存在建立
a 只写,存在写入的数据追加到文件尾,EOF符保留,不存在建立文件
a+ 读写,存在写入的数据追加到文件尾,EOF符不保留,不存在建立文件
  • 返回值:打开成功返回文件指针,失败返回NULL。

(二)fread

fread()函数表示从文件流读取数据,函数原型为:

size_t fread(void* buff,size_t size,size_t count,FILE* stream)

参数说明:

  • void* buff :接受数据的数据块指针。
  • size_t size :每次读取数据的大小。一般用sizeof(数据类型)获取。
  • size_t count :读取数据个数。一般用strlen(存储数据变量名)获取。
  • stream:指向要读取的文件。
  • 返回值:读取成功则返回读取到的字节,失败返回0.

(三)fwrite

fwrite()表示向文件中写入数据,函数原型:

size_t fwrite(const void* buffer,size_t size,size_t count,FILF* stream)

参数说明:

  • const void* buffer:保存数据的数据块指针。
  • size_t size:数据块的大小。一般用sizeof(数据类型)获取。
  • size_t size:数据个数。为存储数据的数据块定义的大小。
  • stream:要写入数据的文件指针。
  • 返回值:成功返回写入的数据量,失败返回0。

(四)fseek

fseek()表示重新定位文件内部指针,即指向文件数据上的指针,函数原型为:

int fseek(FILE* stream,long offest,int framwhere)

参数说明:

  • stream:文件指针。
  • long offest:指针偏移量。
  • int fram where:指针偏移位置,可取值:
参数 含义
SEEK_SET 距离文件开头offest,宏值为0
SEEK_CUR 距离当前位置offset,宏值为1
SEEK_END 距离文件结尾offset,宏值为2

例如:fseek(file,20L,2)把file指针退回到离文件结尾20字节处。

  • 返回值:重定位成功返回0,失败则返回-1

(五)fclose

fclose()关闭文件,关闭口缓冲区会把文件缓冲区的数据输出到磁盘文件,并释放文件有关的缓冲区和文件指针。函数原型:

int fclose(FILE* stream)

参数说明:

  • stream:文件指针
  • 返回值:成功0&#x
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32通用I/O口的库函数编程方法一般包括以下几个步骤: 1. 初始化GPIO口:在使用GPIO口之前,需要先对其进行初始化设置。可以使用库函数GPIO_Init()函数进行初始化。 2. 配置GPIO口的工作模式:根据实际需求,选择GPIO口的输入/输出模式、推挽/开漏输出、上拉/下拉等工作模式。可以使用库函数GPIO_InitStructure结构体的成员变量进行设置。 3. 配置GPIO口的输出值:如果GPIO口设置为输出模式,需要设置其输出的值。可以使用库函数GPIO_WriteBit()函数进行设置。 4. 读取GPIO口的输入值:如果GPIO口设置为输入模式,需要读取其输入的值。可以使用库函数GPIO_ReadInputDataBit()函数进行读取。 示例代码如下: ```c #include "stm32f10x.h" void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置PA5为推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //配置PA0为上拉输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } int main(void) { GPIO_Configuration(); //设置PA5输出高电平 GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET); //读取PA0输入状态 if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) { //执行某些操作 } while(1) { //程序循环体 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值