文件理解

基本概念

文本文件

TAG:文件,文件基本概念,文本文件
TEXT:计算机信息系统中,根据信息的存储时间,可以分为临时性信息和永久性信息。简单地来说,临时信息存储在计算机系统临时存储设备(例如存储在计算机内存),这类信息随 系统断电而丢失。永久性信息存储在计算机的永久性存储设备(例如存储在磁盘和光盘)。永久性的最小存储单元为文件,因此文件管理是计算机系统中的一个重要问题。
对于数字信息1000,在计算机中可以有两种方法表示。第一种方法是用整数1000来表示,第二种是用字符串“1000”表示。下面一个简单的程序,主要的目的是应用上述两种方法在屏幕上输出简单的数字信息1000。
例12-1 在屏幕上输出整数1000
#include <stdio.h>
void main()
{
char szText[10];
int a;
scanf("%d",&a);
scanf("%s",szText);
printf("\n%d",a);
printf("\n%s",szText);
}
程序运行结果如下
输入:
1000
1000
输出:
1000
1000
从程序的运行情况来看,两次输入的信息相同,都是在键盘上按下“1”、“0”、“0”、 “0”四个键。两次的输出的结果一样,在屏幕上输出“1”、“0”、“0”、 “0”等四个字符。但是在程序内部,两种方法的实现机制不同。第一种方法用整数变量存储1000,在计算机内存中占用两个字节。第二种方法用字符串来存储1000,在内存中占用4+1个字节。可以看出对于1000这样一个简单的信息。采用字符串和整型变量存储,可以达到相同的目的,但是存储信息所用空间和处理方式不同。
文件作为信息存储的一个基本单位,根据其存储信息的方式不同,分为文本文件(又名ASCII文件)和二进制文件。如果将存储的信息采用字符串方式来保存,那么称此类文件为文本文件。如果将存储的信息严格按其在内存中的存储形式来保存,则称此类文件为二进制文件。例如下面的一段信息:
“This is 1000”
在C语言中,分别采用字符串和整数来表示,如下:
char szText[]=”This is ”;
int a=1000;
其中“This is”为一个字符串,1000为整型数据。如果这两个数据在内存中是连续存放的,则其二进制编码的十六进制形式为:
54 68 69 73 20 69 73 20 00 03 E8
如果将上述信息全部按对应的ASCII编码来存储,则其二进制编码的十六进制形式为:
54 68 69 73 20 69 73 20 00 31 30 30 30
如果上述信息保存到文件中是按
54 68 69 73 20 69 73 20 00 03 E8
形式来存储,则称此文件为二进制文件。如果是按
54 68 69 73 20 69 73 20 00 31 30 30 30
形式来存储,则称此文件为文本文件。
在C语言中,把文件看作一组字符或二进制数据的集合,也称为“数据流”。“数据流”的结束标志为-1,在C语言中,规定文件的结束标志为EOF。EOF为一符号常量,其定义在头文件“stdio.h”中,形式如下:
#define EOF (-1) /* End of file indicator */

 

二进制文件

TAG:文件,文件基本概念,文本文件
TEXT:如果将存储的信息严格按其在内存中的存储形式来保存,则称此类文件为二进制文件。
例如下面的一段信息:
“This is 1000”
在C语言中,分别采用字符串和整数来表示,如下:
char szText[]=”This is ”;
int a=1000;
其中“This is”为一个字符串,1000为整型数据。如果这两个数据在内存中是连续存放的,则其二进制编码的十六进制形式为:
54 68 69 73 20 69 73 20 00 03 E8
如果将上述信息全部按对应的ASCII编码来存储,则其二进制编码的十六进制形式为:
54 68 69 73 20 69 73 20 00 31 30 30 30
如果上述信息保存到文件中是按
54 68 69 73 20 69 73 20 00 03 E8
形式来存储,则称此文件为二进制文件。
 

文件定义

TAG: 文件,文件基本概念,文件定义
TEXT: 在一个应用程序中,可能同时处理多个文件,如何来描述并区分多个文件呢?在C语言中定义了一个结构体数据类型FILE来描述文件信息,在“stdio.h”中具体的定义如下:
/* Definition of the control structure for streams
*/
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 */
引入FILE类型之后,可以定义FILE变量来存储文件的基本信息。下面的语句定义了一个文件FILE类型的变量oFile1。
FILE oFile1;
由于FILE类型为结构体类型,因此FILE类型变量之间,不能简单进行赋值运算。为了提高运行效率,文件处理函数基本上以FILE指针变量作为函数形式参数或返回值。
在C语言中,文件输入输出处理通过一组库函数来实现,函数原型包含在“stdio.h”中,例如:
FILE * fdopen (int handle, char *type);
int fgetchar (void);
int flushall (void);
int fputchar (int c);
一般来讲,以f开头的函数均为文件处理函数。文件处理函数可以分为如下几类:
1) 文件打开与关闭函数;
2) 文件读写函数;
3) 文件定位函数;
4) 文件状态跟踪函数。
 

ANSI C文件处理函数 

文件打开与关闭

文件打开fopen函数 

TAG:文件,ANSI C文件处理函数,文件打开与关闭,文件打开fopen函数TEXT:在C语言中,文件的打开操作是通过fopen函数来实现的,此函数的声明在“stdio.h”中,原型如下:FILE *  fopen (const char *path, const char *mode);函数形式参数说明如下:const char *path ——文件名称,用字符串表示;const char *mode ——文件打开方式,同样用字符串表示。函数返回值——FILE类型指针。如果运行成功,fopen 返回文件的地址,否则返NULL。提示: 注意检测fopen函数的返回值,防止打开文件失败后,继续对文件进行读写而出现严重错误。文件名称一般要求为文件全名,文件全名由文件所在目录名加文件名构成。例如文件8_4.C存储在C驱动器的temp目录中,则文件所在目录名为“c:\temp”,文件名为“8_4.C”,文件全名为“c:\temp\8_4.C”。如果用字符串来存储文件全名,语句如下:char szFileName[256]=“c:\\temp\\8_4.c”fopen函数允许文件名称仅仅为文件名,那么此文件的目录名由系统自动确定,一般为系统的当前目录名。假设ctest.c中包括如下的程序语句:FILE *fpFile;
fpFile =fopen(“C:\\a.txt”, “w+”);编译连接后形成可执行程序ctest.exe。无论ctest.exe在什么目录下运行,都会准确的打开C盘根目录下的a.txt文件。但是如果包括如下的程序语句:FILE *fpFile;
fpFile =fopen (“a.txt”, “w+”);则文件“a.txt”的位置则与ctest.exe所在的目录有关。假设Ctest.exe存储在c:\tc目录下,执行下面的dos命令:c:\>cd c:\tc
c:\tc>Ctest
则在c:\tc目录下创建了名为a.txt的文件。但是如果执行下面的dos命令:c:\>cd c:\
c:\>C:\TC\ctest
则在c:\目录下创建了名为a.txt的文件。因此在确定文件名称时,要非常注意。提示: 注意文件名称的格式要求路径的分割符为“\\”,而不是“\”,因为在C语言中“\\”代表字符\。例如“C:\\Test.dat”根据不同的需求,文件的打开方式有如下几种模式:1) 只读模式2) 只写模式3) 追加模式4) 读写模式牋牋牋?char *mode 含义 注释 牋牋牋牋牋?“r”?只读 打开文本文件,仅允许从文件读取数据 牋牋牋牋牋?“w”?只写 打开文本文件,仅允许向文件输出数据 牋牋牋牋牋?“a”?追加 打开文本文件,仅允许从文件尾部追加数据 牋牋牋牋牋?“rb” 只读 打开二进制文件,仅允许从文件读取数据 牋牋牋牋牋?“wb” 只写 打开二进制文件,仅允许向文件输出数据 牋牋牋牋牋?“ab” 追加 打开二进制文件,仅允许从文件尾部追加数据 牋牋牋牋牋?“r+” 读写 打开文本文件,允许输入/输出数据到文件 牋牋牋牋牋?“w+” 读写 创建新文本文件,允许输入/输出数据到文件 牋牋牋牋牋?“a+” 读写 打开文本文件,允许输入/输出数据到文件 牋牋牋牋牋?“rb+”读写 打开二进制文件,允许输入/输出数据到文件 牋牋牋牋牋?“wb+”读写 创建新二进制文件,允许输入/输出数据到文件 牋牋牋牋牋?“ab+”读写 打开二进制文件,允许输入/输出数据到文件

牋牋?提示:注意文件打开模式参数为字符串,不是字符。另外,对不同的操作系统或不同的C语言编译器,文件打开模式参数可能不同。

REF:.txt,只读模式.txt,只写模式.txt,追加模式.txt,读写模式.txt 
 只读模式 

TAG:文件,ANSI C文件处理函数,文件打开与关闭,文件打开fopen函数,文件打开模式,只读模式TEXT:只能从文件读取数据,也就是说只能使用读取数据的文件处理函数,同时要求文件本身已经存在。如果文件不存在,则fopen的返回值为NULL,打开文件失败。由于文件类型不同,只读模式有两种不同参数。“r”用于处理文本文件(例如.c文件和..txt文件),“rb” 用于处理二进制文件(例如.exe文件和.zip文件)。

REF:.txt 
 只写模式 

TAG:文件,ANSI C文件处理函数,文件打开与关闭,文件打开fopen函数,文件打开模式,只写模式TEXT:只写模式;只能向文件输出数据,也就是说只能使用写数据的文件处理函数。如果文件存在,则删除文件的全部内容,准备写入新的数据。如果文件不存在,则建立一个以当前文件名命名的文件。如果创建或打开成功,则fopen返回文件的地址。同样只写模式也有两种不同参数,“w”用于处理文本文件,“wb”用于处理二进制文件。

 

REF:.txt 
 追加模式 

TAG:文件,ANSI C文件处理函数,文件打开与关闭,文件打开fopen函数,文件打开模式,追加模式TEXT:
追加模式;一种特殊写模式。如果文件存在,则准备从文件的末端写入新的数据,文件原有的数据保持不变。如果此文件不存在,则建立一个以当前文件名命名的新文件。如果创建或打开成功,则fopen的返回此文件的地址。其中参数“a”用于处理文本文件,参数“ab”用于处理二进制文件。

REF:.txt 
 读写模式 

TAG:文件,ANSI C文件处理函数,文件打开与关闭,文件打开fopen函数,文件打开模式,读写模式TEXT:
读写模式:可以向文件写数据,也可从文件读取数据。此模式下有如下的几个参数:“r+”,“rb”:要求文件已经存在,如果文件不存在,则打开文件失败。“w+”和“wb+”:如果文件已经存在,则删除当前文件的内容,然后对文件进行读写操作;如果文件不存在,则建立新文件,开始对此文件进行读写操作。“a+”和“ab+”如果文件已经存在,则从当前文件末端的内容,然后对文件进行读写操作;如果文件不存在,则建立新文件,然后对此文件进行读写操作。

REF:.txt 
 文件关闭fclose函数 

TAG:
TEXT:在C语言中,文件的关闭是通过fclose函数来实现。此函数的声明在“stdio.h”中,原型如下:int fclose (FILE *stream);
函数形式参数说明如下:FILE *stream ——打开文件的地址。函数返回值 ——int 类型,如果为0,则表示文件关闭成功,否则表示失败。.文件处理完成之后,最后的一步操作是关闭文件,保证所有数据已经正确读写完毕,并清理与当前文件相关的内存空间。在关闭文件之后,不可以再对文件进行读写操作,除非再重新打开文件。例13-2 打开名为“a.txt”的文件,并向文件输出字符串“TestFile”,然后关闭文件,同时在屏幕上输出fclose的返回值。#include "stdio.h"
void main()
{
FILE *fpFile;
int nStatus=0;
If((fpFile=fopen("a.txt","w+"))==NULL)
{
printf(“Open file failed!\n”);exit(0);
}
fprintf(fpFile,"%s","TestFile");
nStatus=fclose(fpFile);
printf("%d",nStatus);
}
提示:注意在文件处理的最后调用fclose函数关闭文件。在关闭文件之后,不可再对文件进行读写操作。

文件读写

字符的读写 

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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值