Linux-C高级编程(1)文件操作(二)

四.常用库函数对文件的操作函数和实例

              FILE不是结构体变量,它是用typedef定义的新类型名,

(1)fopen

       FILE*fp;

       fp=fopen(char*filename,char *mode)

打开一个文件名为filename的文件,打开方式为mode

       FILE*fp;

if((fp=fopen(“filename”,”r”))==NULL)

{

       printf(“filecannot be opened!\n”);

       exit(0);

}

mode可为:rt,wt,at;     rb,wb,ab;      rt+,wt+,at+;         rb+,wb+,ab+(也可以不加t,eg:r,w,a,默认的就是t即文本文件)

(2)fclose(FILE *stream)

关闭FILE结构体指针变量对应的文件成功返回0,否则返回非零

(3) char fgetc(FILE *stream)

从指定文件中读取一个字符,函数返回值就是该字符,若遇到文件结束符EOF则返回-1

 

(4) char fputc(char ch,FILE *stream)

将字符ch的值写入所指定文件的当前位置处,并将文件指针后移一位,函数的返回值是所写入的字符,出错返回-1遇到文件尾返回EOF.

eg1.

#include <stdio.h>

#include <stdlib.h>

int main(void)

{     FILE*fp;

       charch;

       if((fp=fopen("test1.txt","r"))==NULL)

       {

              printf("Thisfile cannot be opened!\n");

              exit(1);

       }

       ch=fgetc(fp);                       /*注意换行符照样读出*/

       while(ch!=EOF)                   /*这里也可以写成ch!=-1*/

       {

              putchar(ch);

              ch=fgetc(fp);

       }

       fclose(fp);

       return0;

}

(5)fegts(字符数组名,n,文件指针)

       从文件指针指定文件中读取n-1个字符,并把它送到字符数组中,函数在读入字符串后将自动加上字符串结束标志’\0’,因此送到字符数组中的字符为n个,在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束(也就是说只要n足够大,fgets读出的就是一行,并且’\n’也会读入到字符串),函数返回值就是字符数组的首地址。

 

注意:fgets(buff,512,stdin);表示用键盘输入数据到buff中,最多可接受512个字节,这个可以接收空格,而scanf函数不能接收空格

(标准输入stdin,标准输出stdout,标准错误输出stderr)

(6)fputs(字符串,文件指针)

       把字符串写入文件指针指定的文件中,字符串可以是字符串常量,也可以是字符数组名

 

(7)     int fscanf(FILE *stream,char*format,arg_list)

int fprintf(FILE*stream,char *format, arg_list)

按指定的格式对文件进行格式化的输入和输出,stream为流文件指针,其余两个参数与scanf和printf用法相同

 

(8)   rewind(fp)

       把文件内部的文件指针移到文件首

(9)    fseek(文件指针,位移量,起始点)

把文件内部位置指针移到指定位置,“位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB时不会出错,当用常量表示位移量时要加后缀“L”

起始点:                                          表示符号:                                       数字表示:

文件首                                              SEEK_SET                                              0

当前位置                                          SEEK_CUR                                             1

文件末尾                                          SEEK_END                                             2

 

(10) fread(buff,size,count,fp)

       fwrite(buff,size,count,fp)

以数据块的形式读写文件,size是数据块的大小,count是执行一次函数读取或写入数据块的个数

eg2:

#include <stdio.h>

 

int main(void)

{

       chars[40];

       inti;

       FILE*fp;

       if((fp=fopen("test1.txt","r"))==NULL)

       {

              printf("openerror!\n");

              return1;

       }

       fseek(fp,-10L,SEEK_END);

       fread(s,2,5,fp);

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

              putchar(s[i]);

       fclose(fp);

       return0;

}

 

eg3.

#include <stdio.h>

#define SIZE 4

struct student_type

{

       charname[10];

       intnum;

       intscore;

}stud;

 

int main(void)

{

       inti;

       FILE*fp;

       if((fp=fopen("stu_list","wb"))==NULL)

       {

              printf("openerror!\n");

              return1;

       }

       printf("Inputdata please:\n");

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

       {

              scanf("%s%d%d",stud.name,&stud.num,&stud.score);

              fwrite(&stud,sizeof(structstudent_type),1,fp);

       }

       fclose(fp);

       printf("Allright!\n");

       return0;

}

 

 

 

 

 

(11) feof(fp)=1说明遇到文件尾,如果未遇到文件结尾feof(fp)=0;

eg4.

#include<stdio.h>

 

int main(void)

{

       FILE *fp;

       char ch;

       if(NULL==(fp=fopen("test1.txt","r")))        /*注意这种写法*/

       {

              printf("open error!\n");

              return 1;

       }

       ch=fgetc(fp);

       while(!feof(fp))            /*这里也可以写成while(feof(fp)!=1)*/

       {

              putchar(ch);

              ch=fgetc(fp);

       }

       fclose(fp);

       return 0;

}

 

(12)long ftell(FILE *fp)

用于得到文件位置指针当前位置相对于文件首的偏移字节数

计算文件大小:    long flen;

                    fseek(fp,0L,SEEK_END);  /* 定位到文件末尾 */

flen=ftell(fp);                      /* 得到文件大小 */

13

调用系统库要用头文件<unistd.h>

调用标准库函数要用头文件<stdlib.h>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值