字符的读写
TAG:文件,ANSI C文件处理函数,文件读写,字符的读写TEXT:
fputc与fgetc函数和标准输入输出函数getchar与putchar类似,其在“stdio.h”中的原型如下:int fputc (int c, FILE *stream);
int fgetc (FILE *stream);
fputc函数的作用是从当前文件位置开始向文件输出一个字符。函数形式参数说明如下:int c ——准备输出的字符。FILE *stream ——文件地址,为FILE *类型变量。函数返回值 ——int 类型。如果返回值为- 1(EOF),则表示字符输出失败,否则返回值为c,即与输出的字符相等。fgetc函数的作用是从当前文件位置读取一个字符。函数形式参数说明如下:FILE *stream ——用读写模式和只读模式打开的文件地址,为FILE *类型变量。函数返回值 ——int 类型。如果返回值为- 1,表示已经读到文件末尾,否则返回读到的字符。例13-3
从键盘读取字符,并输出到“text.txt”文件中。#include "stdio.h"
void main()
{
FILE *fpFile;
char c;
if((fpFile=fopen("c:\\test.txt","w"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
while((c=getchar())!='Q')
fputc(c,fpFile);
fclose(fpFile);
}
程序运行结果如下:输入:This is a test txt file!
Ok!
Q
文件c:\test.txt的内容如下:This is a test txt file!
Ok!
例13-4 模拟DOS系统的TYPE命令,在屏幕上显示文件的内容。#include "stdio.h"
void main()
{
FILE *fpFile;
char szFileName[20];
int c;
printf("Please input the file name:\n");
scanf("%s",szFileName);
if((fpFile=fopen(szFileName,"w+"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
while((c=fgetc(fpFile))!=EOF)
putchar(c);fclose(fpFile);
}
程序运行结果如下:输入c:\test.txt
输出:This is a test txt file!
Ok!
例13-5 模拟DOS系统的 COPY命令,实现文件复制。#include "stdio.h"
void main()
{
FILE *fpFrom,*fpTo;
char szFromFile[20];
char szToFile[20];
int c;
printf("Please input the from file name:\n");
scanf("%s",szFromFile);
printf("Please input the to file name:\n");
scanf("%s",szToFile);
if((fpFrom=fopen(szFromFile,"r"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
if((fpTo=fopen(szToFile,"w"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
while((c=fgetc(fpFrom))!=EOF)
fputc(c,fpTo);
fclose(fpFrom);
fclose(fpTo);
}
REF:.txt
数值的读写
TAG:文件,ANSI C文件处理函数,文件读写,数值的读写TEXT:
另外,一般的C编译系统中还提供了字(Word)的输入输出函数,即一次读写一个字(两个字节)的信息,其在“stdio.h”中的原型如下:int getw (FILE *stream);
int putw (int w, FILE *stream);
getw 函数的作用是从文件读取一个字信息,函数的形式参数如下:FILE *stream ——文件地址;函数返回值 ——如果成功读取,则返回当前读入的信息,否则返回EOF;例如下面的程序:int b;
FILE *fp;
..
b=getw(fp);
putw 函数的作用是向文件写一个字信息。函数的返回值为当前写入的信息,为一个整数。如果成功,与输入参数w的值相等,否则返回EOF。putw函数的作用将一个字的信息输出到文件中,函数的形式参数如下:FILE *stream ——文件地址;int w ——整型数据;函数返回值 ——如果成功,与输入参数w的值相等,否则返回EOF。例如下面的程序: int b;
FILE *fp;
…b=putw(b,fp);
REF:.txt
格式化读写
TAG:文件,ANSI C文件处理函数,文件读写,格式化读写TEXT:
文件输入输出函数中提供了与scanf和printf类似的函数——fscanf和fprintf,其在“stdio.h”中的原型如下:int fprintf (FILE *stream, const char *format, ...);
int fscanf (FILE *stream, const char *format, ...);
对比int printf (const char *format, ...);
int scanf (const char *format, ...);
发现,文件输入输出函数中仅仅多了形式参数FILE *stream,即文件地址,其他的形式参数完全相同。例如:scanf(“%d”,&d)的作用是从键盘中读取一个整型数据到变量d中。fscanf(stream,“%d”,&d) 的作用是从当前打开的文件中读取一个整型数据到变量d中。例12-6 从键盘读入5位同学的姓名、数学成绩、物理成绩和化学成绩,并计算总分后输出到文本文件“student.dat”中。#include "stdio.h"
void main()
{
FILE *fpFile;
float fPhyscial,fMath,fChemical;
float fTotal;
char szName[20];
int i;
if((fpFile=fopen("student.dat","w"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
printf("Name\tPhyscial\tMath\tChemical\n");
for(i=0;i<3;i++)
{
scanf("%s%f%f%f",szName,&fPhyscial,&fMath,&fChemical);
fTotal=fPhyscial+fMath+fChemical;
fprintf(fpFile,"%s\t%2.2f\t%2.2f\t%2.2f\t%2.2f\n",szName,fPhyscial,fMath,fChemical,fTotal);
}
fclose(fpFile);
if((fpFile=fopen("student.dat","r"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
printf("Name\tPhyscial\tMath\tChemical\tTotal\n");
while(!feof(fpFile))
{
fscanf(fpFile,"%s%f%f%f",szName,&fPhyscial,&fMath,&fChemical,&fTotal);
printf("%s\t%2.2f\t\t%2.2f\t%2.2f\t%2.2f\n",szName,fPhyscial,fMath,fChemical,fTotal);
}
}
程序运行结果如下:输入John 78.50 85.50 90.00
Bob 89.50 91.00 82.00
Lili 82.50 90.00 87.00
输出John 78.50 85.50 90.00 254.00
Bob 89.50 91.00 82.00 262.50
Lili 82.50 90.00 87.00 259.50
REF:.txt
块的读写
TAG:文件,ANSI C文件处理函数,文件读写,块的读写TEXT:
文件输入输出函数中还提供了块的输入输出函数,即将内存中的一段信息作为一个整体进行输入输出操作,其在“stdio.h”中的原型如下:size_t fread (void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite (const void *ptr, size_t size, size_t n,
FILE *stream);
其中size_t在“stdio.h”中的定义如下typedef unsigned size_t;
函数的形式参数如下:void *ptr ——数据在内存中的首地址。可以为任何类型的指针变量。在fread函数中此参数为输出参数,必须输入有效的内存地址,并有足够的内存空间;在fwrite函数中,其为输入参数,仅仅要求输入有效的内存地址。size_t size ——块数据的大小,以字节为单位。size_t size ——块数据的数量,以字节为单位。FILE *stream ——已经打开文件的地址。函数的返回值——size_t类型。如果函数运行成功,则返回块数据的大小,否则返回0。此函数的主要应用在如下几个方面:1)
简单变量的读写;2) 数组的读写;3) 结构体变量的读写。首先介绍应用上述函数读取简单变量。例如:char c;
int n;
float f;
double d;
FILE *fp;
/*写数据*/fwrite(&c,sizeof(char),1,fp);fwrite(&n,sizeof(int),1,fp);fwrite(&f,sizeof(float),1,fp);fwrite(&d,sizeof(double),1,fp);/*读数据*/fread (&c,sizeof(char),1,fp);fread (&n,sizeof(int),1,fp);fread (&f,sizeof(float),1,fp);fread (&d,sizeof(double),1,fp);…其次介绍函数在数组读写方面的应用。由于数组具有连续的存储空间,数据连续存放,如果一个一个元素的读写,效率低下。而使用块读写函数实现整体的读写,可以到大幅度提高文件读写速度。例如下面的代码。char
szText[50];
double dArray[20];
FILE *fp;
/*写数据*/fwrite(szTexr,sizeof(char),50,fp);fwrite(dArray,sizeof(double),20,fp);/*读数据*/fread (&c,sizeof(char),1,fp);fread (szTexr,sizeof(char),50,fp);fread (dArray,sizeof(double),20,fp);例12-7 从键盘读取10个整型数据存储到文件中,然后再从文件中读取数据,并输出到屏幕。#include <stdio.h>
int main()
{
FILE *fpFile;
int nArray[10];
int i ;
if((fpFile=fopen("data.dat","w"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
i=0;
while(i<10)
{
scanf("%d",&nArray[i]);
i++;
}
fwrite(nArray,sizeof(int),10,fpFile);
fclose(fpFile);
getchar(); /*暂停*/return 0;
}
程序的运行结果如下输入:1 2 3 4 5 6 7 8 9 0
下面的程序是读取数据的代码。#include <stdio.h>
int main()
{
FILE *fpFile;
float fArray[10];
int i ;
if((fpFile=fopen("data.dat","r"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
i=0;
fread(fArray,sizeof(float),10,fpFile);
while(i<10)
{
printf("%7.2f",fArray[i]);
i++;
}
fclose(fpFile);
getchar(); /*Pause */
return 0;
}
程序运行结果如下:输出:1 2 3 4 5 6 7 8 9 10
块读写函数最重要应用在于读取结构体类型数据。结构体类型变量中包含若干成员变量,对于结构体变量的操作,需要分别对各个成员变量进行操作。例如下面的程序:struct Point
{
double x;
double y;
double z;
}oPoint;
FILE *fp;
…fscanf(fp,“%f%f%f”,& oPoint.x, & oPoint.y,, & oPoint.z);fprintf(fp,“%f%f%f”,oPoint.x, oPoint.y,, oPoint.z);…结构体变量的各成员变量在内存中是连续存放的,因此具备使用块读写函数的条件,上述代码改写后如下:struct Point
{
double x;
double y;
double z;
}oPoint;
FILE *fp;
…fread(&oPoint,sizeof(struct Point),1,fp);
fwrite(oPoint,sizeof(struct Point),1,fp);
…例12-8 从文件中读取坐标信息,并在屏幕上绘制多边形。#include <math.h>
#include <stdio.h>
#include <graphics.h>
struct Point
{
double x; /*x坐标*/double y; /*y坐标*/double z; /*z坐标*/};
/*全局变量*/int GraphDriver; /*图形设备的驱动程序ID */int GraphMode; /*图形模式ID *//*图形模式初始化函数*/void Initialize(void);
MyMoveto( const struct Point* pPoint)
{
moveto(pPoint->x,pPoint- >y) ;
}
MyLineto(const struct Point* pPoint)
{
lineto(pPoint->x,pPoint- >y) ;
}
int main()
{
struct Point oPoint ;
FILE *fpFile;
int bFirst=1;
if((fpFile=fopen("point.dat","r"))==NULL)
{
printf("Open file failed!\n");
exit(0);
}
Initialize(); /* 将当前的系统输出模式调整为图形模式*/while(!feof(fpFile))
{
fread(&oPoint,sizeof( struct Point ),1,fpFile);
if(bFirst)
{
MyMoveto(&oPoint);
bFirst=0;
}
else
MyLineto(&oPoint);
}
fclose(fpFile);
getchar(); /*暂停 */closegraph(); /*将当前的系统输出模式调回文本模式,为图形库函数 */return(0);
}
/* 将当前的系统输出模式调整为图形模式*/void Initialize(void)
{
int ErrorCode; /* 错误状态信息*/GraphDriver = DETECT; /* 要求系统自动检测,DETECT为符号常量,在graphics.h 定义*//*调用图形库函数initgraph,将当前的系统输出模式调整为图形模式*/initgraph( &GraphDriver, &GraphMode, "" );ErrorCode = graphresult(); /*检测当前的图形输出状态,graphresult()为图形库函数*/if( ErrorCode != grOk )
{
/* 说明在将当前的系统输出模式调整为图形模式的过程中出现错误 *//* 打印错误信息 */printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) );/* 退出应用程序 */exit( 1 );
}
}
程序运行结果如下:
fread和fwrite函数的特点是直接将内存中的一块信息以其二进制形式整体读写,因此主要用于二进制文件的读写。另外注意在使用fwrite函数将不同类型的数据写到同一文件中时,注意读取信息的顺序。例如利用下面的程序写一段数据到文件point.dat中。int main()
{
……fwrite(oPoints,sizeof( struct Point ),5,fpFile);
fwrite(&x,sizeof(double),1,fpFile);
……}
利用下面的程序可以正常的读取文件中的信息。#include <stdio.h>
int main()
{
……fread(oPoints,sizeof( struct Point ),5,fpFile);
fread(&x,sizeof(double),1,fpFile);
…….}
但是如果将语句fread(oPoints,sizeof(structPoint ),5,fpFile)和fread(&x,sizeof(double),1,fpFile) 的顺序调换,将造成数据读取失败。
REF:.txt,C13_4_4.jpg
字符串的读写
TAG:文件,ANSI C文件处理函数,文件读写,字符串的读写TEXT:
在文件输入输出函数中还提供了与gets与fputs类似的字符输入输出函数,其原型如下:char * fgets (char *s, int n, FILE *stream);
int fputs (const char *s, FILE *stream);
fgets函数的形式参数如下:char *s ——有效内存地址,以便可以存储从文件读取的字符串。int n ——读取字符串的长度,确定从文件中读取多少个字符。实质上,此函数从文件中读取n-1个字符到当前的字符串中,然后自动添加字符串结束符‘\0’。但是如果此文件中一行长度小于n,则到此行的换行符为止,并将此换行符读取到字符串中。FILE *stream ——文件地址函数返回值——字符串首地址,如果函数运行成功,则返回s的值;否则则返回NULL。fputs 函数的形式参数如下:const char *s ——有效的字符串,此字符串中不包括‘\n’。int
n ——字符串长度。实质上,在向文件输出信息时,并不输出‘\0’。FILE *stream ——文件地址。函数返回值 ——整型数据,如果函数运行成功,则返回0;否则返回EOF。下面的程序实现了将一个字符串“Hello”写入文件,或从文件中读取一个字符串的方法。char szText[1024];
szText=”Hell0”;FILE *fp;
…fputs (szText,strlen(szText),fp);
..
fget(szText,1024,fp);/*读入一行*/
TAG:文件,ANSI C文件处理函数,文件定位函数TEXT:
文件可以理解为一个完整的数据流,因此可以将“数据流”分为文件头、文件尾和文件主体三个部分。在C语言中通过FILE类型指针描述文件流的位置,因此FILE类型指针又称为文件指针。
图1 文件定位在缺省情况下,文件的读取是按顺序进行的。在完成一段信息的读写之后,文件指针移动到其后的位置上准备读取下一次读写。在特殊情况下,需要对文件进行随机的读写,即读取当前位置的信息后,并不读取紧接其后的信息,而是根据需要读取特定位置处的信息。为了满足文件的随机读写操作,C语言中提供了文件指针定位函数。
REF:.txt,C13_5.jpg,fseek.txt,ftell.txt
fseek
TAG:文件,ANSI C文件处理函数,文件定位函数,fseek函数TEXT: 牋牋?fseek函数是最重要的文件定位函数,此函数在“stdio.h”中的原型如下:牋牋?int fseek (FILE *stream, long offset, int whence);
牋牋?函数的形式参数如下:牋牋?FILE *stream ——文件地址。牋牋?long offset ——文件指针偏移量。牋牋?int whence ——偏移起始位置。牋牋?函数返回值 ——非零值表示是成功,0表示失败。牋牋?在计算文件指针偏移量时,首先要确定其相对位置的起始点。相对位置的起始点分为如下三类:文件头、文件尾和文件当前位置,并定义可以用符号常量表示(表1)。
牋牋?表1 相对位置起始点
牋牋牋牋牋?相对位置起始点 符号常量牋牋 整数值牋?说明 牋牋牋牋牋?文件头牋牋牋?SEEK_SET牋牋牋?0牋牋 相对的偏移量的参照位置为文件头 牋牋牋牋牋?文件尾牋牋牋?SEEK_ END牋牋牋 2牋牋 相对的偏移量的参照位置为文件尾 牋牋牋牋牋?文件当前位置?SEEK_CUR牋牋牋? 1牋牋 相对的偏移量的参照位置为文件指针的当前位置
牋牋?文件偏移量的计算单位为字节,文件偏移量可为负值,表示从当前位置向反方向偏移。牋牋?提示: 由于运行DOS系统的PC机中,长整型数的有效范围为-231~231-1,因此DOS可以管理的最大文件为2048 MB=2GB牋牋?注意,fseek函数对文本文件和二进制文件的处理方式有所不同。对于二进制文件,可以获得准确的定位。对于文本文件要注意如下的问题,首先文件偏移量必须为0或者通过ftell函数获得的文件指针的当前位置,并且相对位置的起始点必须为SEEK_SET。牋牋?另外fseek将指针移动到文件的开始和结束位置时,产生一个文件状态标志,必须使用clearerr函数清除文件状态标志后,才可以继续读写此文件。牋牋?将文件指针移动到文件开始位置的程序如下:牋牋?FILE
*fp;
牋牋?fseek(fp,0L,SEEK_SET);
牋牋?将文件指针移动到文件末尾位置的程序如下:牋牋?fseek(fp,0L,SEEK_END);
scription" ' Custom Parameter names (parameters set "on-the-fly" by the export) Public Const TcpHyperlin
rewind
TAG:文件,ANSI C文件处理函数,文件定位函数,rewind函数TEXT:rewind函数的作用是将当前文件指针重新移动到文件的开始位置,此函数在”stdio.h”中的原型:void rewind (FILE *stream);
函数的形式参数如下:FILE *stream ——文件地址。函数返回值 ——无此函数的作用相当于如下的程序,将文件指针移动到文件头,并清除状态标志。fseek(fp,0L,SEEK_SET);
clearerr(fp);
REF:.txt
ftell
TAG:文件,ANSI C文件处理函数,文件定位函数,ftell函数TEXT:
ftell函数的作用是获得文件指针的当前位置,此位置为相对于文件开始位置的相对偏移量,此函数在“stdio.h”中的原型:long ftell (FILE *stream);
FILE *stream——文件地址。函数返回值——运行成功,返回当前位置相对于文件开始的相对偏移量;否则返回-1L。