文档库 最新最全的文档下载
当前位置:文档库 › 第8章 数据文件编程方法

第8章 数据文件编程方法

第8章数据文件编程方法

首先,看一个熟悉的交换法排序例子:

main(){

int i,j,t,x[10]={2,19,8,-10,7,0,89,3,13,50}; for(i=0;i<9;i++)

for(j=i+1;j<10;j++)

if(x[i]>x[j])

t=x[i],x[i]=x[j],x[j]=t;

for(i=0;i<10;i++)

printf("%d,",x[i]);

getch();

}

改为将结果存入文件demo.txt中:

#include

main(){

int i,j,t,x[10]={2,19,8,-10,7,0,89,3,13,50}; FILE *fp;

fp=fopen("demo.txt","w");

for(i=0;i<9;i++)

for(j=i+1;j<10;j++)

if(x[i]>x[j])

t=x[i],x[i]=x[j],x[j]=t;

for(i=0;i<10;i++)

fprintf(fp,"%d,",x[i]);

fclose(fp);

}

还可以随时读入demo.txt文件内容,完成另外的操作.

#include

main(){

int i,j,m,x[10];

FILE *fp;

fp=fopen("demo.txt","r");

for(i=0;i<10;i++)

fscanf(fp,"%d,",&x[i]);

fclose(fp);

m=x[0];

for(i=0;i<10;i++)

m=min(m,x[i]);

printf("minimum=%d ",m);

getch();

}

int min(int x,int y){

return (x

}

8.1 硬盘文件

8.1.1 二进制文件和文本文件

文件可以存放程序或数据;

文件是由文件名来识别的,只要指明文件名就可以读出或写入数据;

根据数据的组织形式,可以分为两种类型: 文本文件(也称ASCII文件):

二进制文件

两者的区别在于存储数值型数据的方式不同。

C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成,也就是所谓的流式文件。

8.2文件的打开与关闭

在C语言中,对文件的操作一般分为:

打开文件:利用一个文件指针使外部文件与程序之间建立数据交换的可能;

使用文件:使用该文件(读或写);

关闭文件:切断外部文件与程序之间的联系,并保证文件的完整性。

1.文件指针

在C语言的程序中是通过一个文件类型指针来使用外部文件。该结构体类型是系统定义的,包含在stdio.h 中,取名为FILE。

对于每个要操作的文件,用户需先在程序中定义一个指向FILE类型的指针变量,如:

FILE *fp;

This pointer, called the file pointer, points to a structure that contains information about the file, such as the location of a buffer, the current character position in the buffer, whether the file is being read or written, and whether errors or end of file have occurred.

Users don't need to know the details, because the definitions obtained from include a structure declaration called FILE.

文件结构体类型定义:

typedef struct{

short level;

// fill/empty level of buffer unsigned flags;

// file status flags char fd;// file descriptor

unsigned char hold;

// ungetc char if no buffer short bsize;// buffer size

unsigned char buffer;// data transfer buffer unsigned char curp;

// current active pointer unsigned istemp;

// temporary file indicator short token;

// used for validity checking } FILE; // this is the FILE object

2.文件的打开

文件的打开函数:fopen( )

fopen()函数为编译系统提供以下信息:

需要打开的文件名(filename)

使用文件的方式(mode,读还是写等)

让哪个指针变量(fp)指向被打开的文件

fopen()函数的原型为:

FILE*fopen(char*filename, char*mode) filename指定要打开的文件名,可以为字符串常

量或字符串变量

mode表示文件的打开方式

fopen()函数

功能:成功,返回一个指向指定文件的指针。若打开文件不成功,返回空指针NULL。

一般为增强程序的可靠性,常用下面的方法打开一个文件:

if((fp=fopen("data.txt","r"))==NULL){ printf("can not open this file\n");

exit(0);

}

函数原型:stdio.h。

注:对文件操作的库函数,函数原型均在头文件

stdio.h中。后续函数不再赘述。

系统中定义有三个标准设备文件指针:

stdin:

标准输入文件(只读),指向终端输入设备(键盘)。 stdout:

标准输出文件(只写),指向终端输出设备(显示器)。 stderr:

标准错误输出文件(读/写),指向终端输出设备(显示器)。

3.文件的关闭

使用完一个文件后应该将它关闭,使文件指针变量不再指向该文件(此后不能再通过该指针对文件进行读/写操作)

fclose()函数的原型为:

int fclose(EILE*fp);

功能:

执行该函数,若正常关闭,返回零;否则返回非零。

当程序运行正常结束时,系统自动关闭所有的标准文件。

8.3文件的输入/输出操作

文件被打开后可以对文件进行操作,文件的读写操作是最常用的文件操作。

C语言中文件的读写没有特定的输入输出,它是通过函数来实现的。

文件读与写的操作:

1. 读/写文件中的一个字符

2. 读/写一个字符串

3. 读/写一个数据块

4. 对文件进行格式化读/写

8.3.1 读写文件中的单个字符

fputc()函数和fgetc() 函数

fputc()函数原型为:

int fputc(char ch, FILE *fp)

说明:将ch中的字符输出到fp所指向的文件中;输出成功则返回所输出的字符,失败则返回EOF

fgetc()函数原型为:

int fgetc(FILE*fp)

说明:从fp所指向的文件中读入一个字符;成功则返回所读的字符,如发生错误或读到文件结束符失败则返回EOF

例8.3 文件复制(见教材)

#include

main(){

int ch;

FILE *outf, *inf;

outf=fopen("demo.txt","r");

// 以读方式打开原文本文件inf=fopen("复件demo.txt","w");

// 以写方式打开新文本文件ch=fgetc(outf); // 从原文件中读出一字符

while(ch!=EOF){ // 检查是否到文件尾

fputc(ch,inf);// 将字符ch的值写入到新文件中

ch=fgetc(outf);

}

fclose(outf); // 关闭原文件

fclose(inf); // 关闭新文件

}

符号常量EOF和库函数feof()

在对文本文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF (其值在头文件stdio.h中被定义为-1)。

库函数feof() (判断是否到文件尾的函数)

原型:int feof(FILE*fp);

说明:在执行读文件操作时,如果遇到文件尾,则

函数返回逻辑真(1);否则,则返回逻辑假(0)。 feof()函数同时适用于文本文件和二进制文件。

8.3.2 读写文件中的字符串

fgets()函数和fputs()函数

fgets()函数的原型

char *fgets(char*str,int n,FILE*fp);说明:

从指定文件中读入一个规定长度(n-1)字符串,

存入str中,并在尾端自动加一个结束标志‘\0’;同时将读写位置指针向前移动字符串长度个字节。 在读出n-1个字符之前,如遇到了换行符或EOF,

则读出结束。

fgets函数返回值是字符数组的首地址(指针值)。

fputs()函数的原型

int fputs(const char *str,FILE*fp);说明

将str中的字符串写入fp所指文件中;写入错误,则返回EOF。

【例8.4】用字符串读写函数将一个文件逐行输出到终端屏幕上

#include

#include

#define N 80

main(){

char string[N];

FILE *outf;

outf=fopen("c:\\demo.txt","r" );

//如果要指定路径名,要用双斜杠

while(!feof(outf)){ // 检查是否到文件尾

fgets(string,N,outf);

//从原文件中读出N-1个字符作为一个串放入string中fputs(string, stdout);

//将string中的内容送至标准输出文件流,即在显示器上显示出来}

fclose(outf);

getch();

}

相关文档