C语言基础之文件

来源:互联网 发布:2017陌陌站街营销软件 编辑:程序博客网 时间:2024/06/05 20:10

                                                文件

C程序在打开一个文件时,系统会自动在内存中开辟一个“文件信息区”,用来存放这些与打开文件的有关信息。这些信息保存在一个结构体变量中,该结构是有系统定义的,取名为FILE.FILE是在头文件stdio.h

中定义的一个结构体数据类型。

对每一个要进行操作的文件,都需要定义一个指向FILE类型结构体的指针变量,该指针称为文件类型指针(文件指针),定义的方法如下:

FILE *指针变量;

如:

  FILE *fp;

一个文件指针只能指向一个文件。


例:将九九乘法表打印在一个文件中


#include<stdio.h>

#include<stdlib.h>

int main()

{

int i,j;

FILE *fp;                       //定义一个指向FILE类型结构体变量的指针

fp=fopen("cfb.txt","w");     //打开文件 ,w表示只写

if(fp==NULL)       //如果打开不成功,fopen函数将返回一个空指针NULL,这时应及时终止程序

{

printf("can not open cfb.txt!\n");

exit(0);

}

for(i=1;i<=9;i++)    //若打开成功,则向文件cfb.txt输入九九乘法表

{

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

{

fprintf(fp,"%d x %d=%2d",j,i,i*j);     //fprintf函数的功能是向文件输出格式化的数据

if(j==i)

fprinf(fp,"\n");

else

fprintf(fp,"\t");

}

}

fclose(fp);               //关闭文件指针

return 0;

}

fp=fopen("文件名","文件使用方式");

注:1.文件名可以是一个字符串,表示要访问的文件,改字符串应该指明文件的路径,如果不指明,改文件的位置应该是在当前目录下。写路径时应用分隔符/或者\\.

        2.''w''代表只写。这是如果指定的文职不存在改文件,系统将建立一个新的文件,如果已经存在该文件,系统则从文件的起始位置重新写入数据,原有内容够被更新。

                                                           文件使用方式

文本文件    二进制文件                     功能                                       说明
“r”                  "rb"                            为读信息打开已有文件            若指定文件不存在时,则打开文件失败
“w”                "wb"                           为写信息打开或建立文件        文件不存在,建立;存在,覆盖  
“a”                 "ab"                           为读信息打开已有文件            文件不存在,新建;存在,新数据写在后面          
“r+”               "rb+"                          为读写信息打开已有文件         若指定文件不存在时,则打开文件失败
“w+”              "wb+"                        为读写信息打开或建立文件      若指定文件不存在时,则新建文件   
“a+”               "ab+"                        为读写信息打开已有文件           打开一个文件,允许读或在文件尾增加数据,若指定文件不存在,则出错



字符方式文件读写函数
FILE *in,*out;
char ch;
ch=fgetc(in);                       //从文件中读取一个字符
while(ch!=EOF)
{
fputc(ch,out);             //向目标文件写入一个字符
ch=fgetc(in);             //读取下一个字符
}


写字符函数fputc()
调用格式:fputc(c,fp);
(1)fp是指向文件的文件指针,c是一个字符常量或变量,存放待写入文件的字符。该函数用来将c代表的字符写入到文件指针fp所指的文件中。
(2)如果fp是stdout时,语句fputc(c,stdout)等价于putchar(c),即将c代表的字符输出到显示屏上
(3)fputc()函数有一个返回值,如果输出成功,则返回的就是字符的ASCII码值,如果失败,返回EOF(-1)。

读字符函数fgetc()
调用格式:fgetc(fp);
(1)fgetc(fp)是从fp所指向的文件中读取一个字符,若成功,返回所得到的字符,若失败(文件已结束),返回EOF(-1).
(2)如果fp是stdin时,语句c=fgetc(stdin)等价于c=getchar(),即从键盘得到一个字符。
(3)文件内部有一个位置指针,打开文件时,位置指针总是指向文件的第一个字节,没调用一次fgetc函数时,位置指针将向后移动一个字节。


注意:利用EOF判断文件是否结束仅适用与ASCII码文件,因为ASCII码文件没有值为-1 的字符,而-1有可能是二进制文件中的数据。可以用函数feof()判断文件是否结束,如果是,feof(fp)的值为1,否为0。


字符串方式文件读写函数

while(fgets(ch,50,in)!=NULL)        //从源文件中读取一行

fputs(ch,out);                         //写入该行到目标文件

写字符串函数 fputs()

fputs(str,fp);

说明:str可以是字符串常量,指向字符串的指针或者存放字符串的字符数组名。它有一个返回值,若成功,返回0,失败为EOF.

读字符串函数fgets()

fgets(str,n,fp);

说明:

(1)str用来存放字符串的存储单元起始地址,可以是字符数组名或者指向足够空间的字符指针。n是用来指定读取字符的个数,其中包括字符串的结束符在内,所以读取的有效字符为n-1个。

(2)函数从fp所指的文件中读取n-1个字符,放入以str为起始地址的存储单元内。但是遇到换行符或者结束符EOF时将结束本次读取操作,读取的字符(包括换行符)存到str所指向的字符串中,并在末尾追加一个字符串结束标志\0

(3)读取成功,返回就是字符串的起始地址,失败则返回NULL。



格式化文件读写函数

格式化写文件函数fprintf()

fprinf(文件指针,"格式控制",输出列表);

说明:将输出项按指定的格式写入到文件指针变量所指向的文件中,格式控制与输出列表同printf函数一样

如:fprintf(fp,"%d%d",100,200);

执行的结果是将100和200两个整数存放到fp所指向的文件中,当文件之后怎为stdout时,等价于printf.


格式化读文件函数fscanf()

fscanf(文件指针,"格式控制",输入列表);

说明:

(1)从文件指针所指的文件中按指定的格式读取数据到输入列表中的变量中。

如: fscanf(fp,"%d%d",&x,&y);

(2)当文件指针为stdin时,即从标准输入文件(键盘)读取一个整数赋给整型变x.

(3)fscanf(fp,"%s",str); 从文本文件中读取字符串时,遇到空格,跳格符,回车符都认为是字符串结束符。


数据块读写函数

数据块读写函数fwrite()和fread()一般用于二进制文件的输入和输出

写数据块函数fwrite()

fwrite(buffer,size,count,fp)

说明:

(1)buffer是待写入的数据块的存储单元的起始位置,size表示每个数据项的字节数,count表示数据项的个数,fp是文件指针,指向待写入的文件。所以该函数的作用是将

buffer所指的内存区的count个长度为size的数据项写入到fp所指向的文件中。

(2)如果调用成功,返回值为count,即实际写入文件中的数据项数,失败则返回0.

读数据块函数fread()

fread(buffer,size,count,fp)

说明:用来从指定文件读一个数据块存放到指定的存储单元内,其数据块的大小是由数据项的大小(字节数)和数据项的项数决定的。

(1)buffer是用于存放数据块的存储单元的起始地址,size表示每个数据项的字节数,count表示数据项的个数,fp是文件指针,指向待读取的文件

(2)如果调用成功,返回值为count,即实际写入文件中的数据项数,失败则返回0.


其他相关函数

1.整数方式文件读写函数getw()和putw() (大多数编译系统都提供这两个函数)

putw(10,fp);          =int n=10; fwrite(&n,4,1,fp)

它的作用是将整数10输出到fp指向的文件

i=getw(fp);

它的作用是从磁盘文件读一个整数到内存,赋值给整型变量i.

也可以自定义这两个函数:

int putw(int a,FILE*fp)

{

int i;

char *s;

s=&a;

for(i=0;i<4;i++)        //一般是一个机器字(word)存放一个int类型的数据,所以在32位的C编译器中,int类型的整数将占4个字节。

putc(s[i],fp);

return a;

}

int getw(FILE*fp)

{

char *s;

int a,i;

s=&a;

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

s[i]=getc(fp);

return a;

}



顺序读写和随机读写

1.随机定位函数fseek()

fseek函数可以实现将文件的位置指针移到指定位置的功能,其调用格式为:

fseek(文件指针,位移量,起始位置);

说明:

(1)起始位置包括:

文件首,用符号常量 SEEK_SET 表示,在stdio.h中定义#defineSEEK_SET 0

文件当前位置,用符号常量 SEEK_CUR 表示,在stdio.h中定义#define SEEK_SET 1

文件尾,用符号常量 SEEK_END 表示,在stdio.h中定义#define SEEK_SET 2

(2)位移量是文件位置指针移到的字节数,必须是长整型数,用常量表示时要加后缀L

(3)调用成功,返回值为0,失败为-1

(4)对二进制文件能准确移动,对文本文件遇到换行符会发生混乱

例:

fseek(fp,20L,1);      // 执行介绍过是将文件的位置指针移到距当前读写位置20个字节处



2.文件头定位函数rewind()

rewind()的功能是使文件的位置指针重新回到文件的开头,没有返回值。

调用格式为:

rewind(fp);


3.求当前读写位置函数ftell()

ftell()函数的作用是得到文件的当前位置。用相对于文件开头的位移量(字节数)表示。

调用格式:ftell(fp);

说明:如果函数调用成功,则返回文件的当前位置,改数值为长整型,失败则返回-1L。









原创粉丝点击