库函数系统调用文件方式
基于C函数库的文件编程是独立于具体的操作系统平台的,不管是在Windows、Linux还是其他的操作系统中,都是使用这些函数。使用库函数进行程序设计可提高程序的可移植性。
对于标准的C函数库,它们的操作都是围绕流来进行的。流是一个抽象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
在系统调用方式实现的文件访问中,使用文件描述符(一个整数)来指向一个文件。在库函数方式的文件访问中,使用FILE类型来表示一个打开的文件,这个类型中包含了管理文件流的信息。而指向该类型的指针FILE* 则被称之为文件指针。
一、函数学习
1.1打开文件fopen
1.1.1 函数原形
FILE *fopen(const char* path,const char* mode);
1.1.2 函数功能
打开文件
1.1.3 所属头文件
<stdio.h>
1.1.4 返回值
成功:返回文件指针
失败:NULL
1.1.5参数说明
path;指定打开的文件名称(包含路径)
mode:文件打开模式
1.2关闭文件fclose
1.2.1函数原形
int fclose(FILE* fp);
1.2.2 函数功能
关闭文件
1.2.3所属头文件
<stdio.h>
1.2.4返回值
成功:0
失败 EOF
1.2.5参数说明
fp:待关闭文件指针
1.3读文件fread
1.3.1函数原形
size_t fread(void* ptr,size_t size,size_t n,FILE* stream);
1.3.2函数功能
fread()实现从 stream 中读取 n 个字段,每个字段为 size 个字节,并将读取的字段放入 ptr 所指的字符数组中, 返回实际已读取的字段数。在读取的字段数小于 num 时,可能是在函数调用时出现错误,也可能是读到文件的结尾。
1.3.3所属头文件
<stdio.h>
1.3.4返回值
成功:返回成功读取的数据量 失败:0
1.3.5参数说明
stream:指向要读取的文件
ptr:指向读取到的 数据 要保存的位置
size:每块的数据大小
nmemb:读取的数据块数
1.4 写文件fwrite
1.4.1函数原形
size_t fwrite(const void* ptr,size_t size,size_t n,FILE* stream);
1.4.2函数功能
write()实现从缓冲区 ptr 所指的数组中把 n 个字段写到 stream 中,每个字段长为size 个字节,返回实际写入的字段数。
1.4.3所属头文件
<stdio.h>
1.4.4返回值
成功:成功写入数据量
失败:0
1.4.5参数说明
ptr:存放要写入的数据
size:每块的数据大小
nmemb:数据的块数
stream:要写入数据的文件指针
1.5定位文件fseek
1.5.1函数原形
int fseek(FILE* stream,long offset,int whence);
1.5.2函数功能
设置文件位置指针
1.5.3所属头文件
<stdio.h>
1.5.4返回值
成功:返回0
失败:-1
1.5.5参数说明
stream:移动的文件
offset:要移动的偏移量
whence:确定要移动的初始位置
实例:
#include <stdio.h> 2 #define LENGTH 100 3 main() 4 { 5 FILE *fd; 6 char str[LENGTH]; 7 8 fd = fopen("hello.txt", "w+"); /* 创建并打开文件 */ 9 if (fd) 10 { 11 fputs("Hello World", fd); /* 写入字符串 */ 12 fclose(fd); 13 } 14 15 fd = fopen("hello.txt", "r"); 16 fgets(str, LENGTH, fd); /* 读取文件内容 */ 17 printf("%s ", str); 18 fclose(fd); 19 }