第三季-第9课-库函数方式文件编程

第9课-库函数方式文件编程

 

9.1 核心理论

1. 函数库

基于C语言函数库的文件编辑是独立于具体操作系统平台的,不管是windows、linux还是其他的操作系统,都是使用这些函数。使用库函数进行函数程序设计可以提高函数的可移植性。

对于标准的C函数库,它们的操作都是围绕流来进行的。流是一个抽象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。

  1. 文件指针

在系统调用方式实现的文件访问中,使用文件描述符(一个整数)来指向一个文件。在库函数方式的文件访问中,使用FILE类型来表示一个打开的文件,这个类型中包含了管理文件流的信息。而指向件,这个类型中包含了管理文件流的信息。而指向该类型的指针FILE* 则被称之为文件指针。

它和文件描述符的作用是一样的。

9.2 函数学习

学习方法:三不学习法。

先在《UNIX环境高级编程》中找到相关的命令;通过man命令查看函数入队用法和原型等信息;手把手写代码。

  1. 打开文件

(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. 关闭文件

(1)函数名

fclose

(2)函数原形

int fclose(FILE *fp);

(3)函数功能

关闭文件

(4)所属头文件

#include<stdio.h>

(5)返回值

成功:0

失败:EOF

(6)参数说明

fp:待关闭的文件指针

  1. 读文件

(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. 写文件

(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. 文件定位

每一个打开的文件都有一个隐形的指针。

(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);

}

猜你喜欢

转载自www.cnblogs.com/free-1122/p/11345087.html