第三季-第9课-库函数方式文件编程
第9课-库函数方式文件编程
9.1 核心理论
1. 函数库
基于C语言函数库的文件编辑是独立于具体操作系统平台的,不管是windows、linux还是其他的操作系统,都是使用这些函数。使用库函数进行函数程序设计可以提高函数的可移植性。
- 流
对于标准的C函数库,它们的操作都是围绕流来进行的。流是一个抽象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
- 文件指针
在系统调用方式实现的文件访问中,使用文件描述符(一个整数)来指向一个文件。在库函数方式的文件访问中,使用FILE类型来表示一个打开的文件,这个类型中包含了管理文件流的信息。而指向件,这个类型中包含了管理文件流的信息。而指向该类型的指针FILE* 则被称之为文件指针。
它和文件描述符的作用是一样的。
9.2 函数学习
学习方法:三不学习法。
先在《UNIX环境高级编程》中找到相关的命令;通过man命令查看函数入队用法和原型等信息;手把手写代码。
- 打开文件
(1)函数名
fopen
(2)函数原形
FILE *fopen(const char *path,const char *mode);
(3)函数功能
打开文件
(4)所属头文件
#include<stdio.h>
(5)返回值
成功:文件指针
失败:NULL
(6)参数说明
path:指定打开的文件名(包含路径)
mode:文件打开模式
有六种方式:r,w,a,r+,w+,a+
(7)范例程序
#include<stdio.h>
void main()
{
FILE *fd;
fd = fopen("/home/test.txt","w+"); //w+表示在文件不存在的时候可以创建文件。
}
- 关闭文件
(1)函数名
fclose
(2)函数原形
int fclose(FILE *fp);
(3)函数功能
关闭文件
(4)所属头文件
#include<stdio.h>
(5)返回值
成功:0
失败:EOF
(6)参数说明
fp:待关闭的文件指针
- 读文件
(1)函数名
fread
(2)函数原形
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
(3)函数功能
从文件中读取数据
(4)所属头文件
#include<stdio.h>
(5)返回值
成功:成功读取到的数据量
失败:0
(6)参数说明
stream:指向要读取的文件
ptr:指向我们读取后的数据保存位置
nmemb:我们要把读取的数据分成nmemb个块
size:读取数据已经分成nmemb个块,每个块的大小是size。
(7)范例程序
最开始我们使用下面的程序,通过更改/home下的文件,给我们要打开的文件赋予一些数据。但是,我们会发现打印不出来数据。
#include<stdio.h>
void main()
{
FILE *fd;
char c_buf[15];
fd = fopen("/home/test.txt","w+");
fread(c_buf,1,10,fd);
printf("now we read %s\n",c_buf);
fclose(fd);
}
问题出现在w+这个参数上。我们看一下这个参数的说明:open for reading and writing. The file is craet if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the fie. 改成下面的程序就可以了:
#include<stdio.h>
void main()
{
FILE *fd;
char c_buf[15];
fd = fopen("/home/test.txt","r+");
fread(c_buf,1,10,fd);
c_buf[10] = '\0'; //加上终止符,防止打印时出现乱码。
printf("now we read %s\n",c_buf);
fclose(fd);
}
- 写文件
(1)函数名
fwrite
(2)函数原形
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
(3)函数功能
向文件中写入数据
(4)所属头文件
#include<stdio.h>
(5)返回值
成功:成功写入的数据量
失败:0
(6)参数说明
stream:要写入数据的文件指针
ptr:存放要写入到文件中的数据
nmemb:我们要把写入的数据分成nmemb个块
size:写入数据已经分成nmemb个块,每个块的大小是size。
(7)范例程序
#include<stdio.h>
void main()
{
FILE *fd;
char *c_buf = "987654321";
fd = fopen("/home/test.txt","r+");
fwrite(c_buf,5,1,fd);
fclose(fd);
}
- 文件定位
每一个打开的文件都有一个隐形的指针。
(1)函数名
fseek
(2)函数原形
int fseek(FILE *stream, long offset, int whence);
(3)函数功能
设置文件的位置指针。
(4)所属头文件
#include<stdio.h>
(5)返回值
成功:0
失败:-1
(6)参数说明
stream:指向的文件
whence:表示指针的开始位置,只能取下面的三种值。
SEEK_SET文件的开头加上offset(正的)
SEEK_CUR当前的指针加上offset(可正可负)的位置
SEEK_END从文件的末尾加上offset(负的)
offset:指针将要加的数。
(7)范例程序
#include<stdio.h>
void main()
{
FILE *fd;
char *c_buf = "987654321";
fd = fopen("/home/test.txt","r+");
fseek(fd,8,SEEK_SET);
fwrite(c_buf,5,1,fd);
fclose(fd);
}