文件的使用

1. 什么是⽂件

磁盘上的⽂件是⽂件。 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)。

1.1 程序⽂件

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj(Liunx环境后缀.o),可执⾏程序(windows 环境后缀为.exe)。

1.2 数据⽂件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。

1.3 文本名

 ⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。

⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀.

如:

E:\exe\pow.txt    //绝对路径

2.. ⼆进制⽂件和⽂本⽂件

根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件

数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件

3.⽂件的打开和关闭

3.1流与标准流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据.不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念。

C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是同流操作的。

3.1.2标准流

stdin      标准输出流

stdout    标准输入流

stderr     标准错误流

3.2⽂件指针

缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针"(   FILE*  (文件指针)  ).

FILE*pf     

通过⽂件指针变量能够间接找到与 它关联的⽂件。

ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

//打开文件

FILE * fopen ( const char * filename, const char * mode );

//关闭文件

int fclose ( FILE * stream );

int main ()
{
 FILE * pFile;
 //打开⽂件
 pFile = fopen ("myfile.txt","w");
 //⽂件操作
 if (pFile!=NULL)
 {
 fputs ("fopen example",pFile);
 //关闭⽂件
 fclose (pFile);
 }
 return 0;
}

 可以fclose关闭文件,同时程序结束也会关闭文件。

4.⽂件的顺序读写 

4.1顺序读写函数介绍

5.⽂件的随机读写

5.1fseek 

根据⽂件指针的位置和偏移量来定位⽂件指针。

int fseek ( FILE * stream, long int offset, int origin );

//stream文件指针

//offset移动位置

//位置  如:SEEK_SET

//SEEK_SET 开头
//SEEK_END 现在位
//SEEK_CUR 末尾 

下列实例: 

int main()
{
  FILE*pFile = fopen ( "example.txt" , "wb" );
 fputs ( "This is an apple." , pFile );
 fseek ( pFile , 9 , SEEK_SET );
 fputs ( " sam" , pFile );
 fclose ( pFile );
 return 0;
}

 

5.2ftell

返回⽂件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

下列实例 

int main ()
{
 FILE * pFile;
 long size;
 pFile = fopen ("myfile.txt","rb");
 if (pFile==NULL)
 perror ("Error opening file");
 else
 {
 fseek (pFile, 0, SEEK_END); // non-portable
 size=ftell (pFile);
 fclose (pFile);
 printf ("Size of myfile.txt: %ld bytes.\n",size);
 }
 return 0;
}

 

5.3rewind

让⽂件指针的位置回到⽂件的起始位置

void rewind ( FILE * stream );

使用实例: 

int main ()
{
 int n;
 FILE * pFile;
 char buffer [27];

 pFile = fopen ("myfile.txt","w+");
 for ( n='A' ; n<='Z' ; n++)
 fputc ( n, pFile);
 rewind (pFile);

 fread (buffer,1,26,pFile);
 fclose (pFile);

 buffer[26]='\0';
 printf(buffer);
 return 0;
}

 

6.⽂件读取结束的判定

牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束.

6.1 被错误使⽤的 feof

当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

1.⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

2.⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。

例如:

• fread判断返回值是否⼩于实际要读的个数。 

6.2.ferrof判断错误 

int main(void)
{
 int c; // 注意:int,⾮char,要求处理EOF
 FILE* fp = fopen("test.txt", "r");
 if(!fp) {
 perror("File opening failed");
 return EXIT_FAILURE;
 }
 //fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF
 while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环
 {
 putchar(c);
 }
 //判断是什么原因结束的
 if (ferror(fp))
 puts("I/O error when reading");
 else if (feof(fp))
 puts("End of file reached successfully");
 fclose(fp);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值