20150827笔记:C库函数功能

本文详细介绍了C语言中的文件操作函数,包括fopen用于打开文件,fread/fwrite实现数据块的读写,fprintf/fscanf进行格式化输入输出,fclose关闭文件,feof判断文件结束,fseek进行文件定位,以及fopen的各种模式说明,如'r'、'w'、'a'等。示例代码展示了如何正确使用这些函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)fopen:打开文件   

形式:FILE*  fopen(const  char *  filename , const  char* mode)

 即:FILE* fp=NULL

      fp=fopen(文件名,文件打开方式);

如:fopen(“E:\\a.txt”,“r”);  //  注:“\\”代表转义字符,表示一个反斜杠

mode对应的功能:

a.“r”:打开一个文本文件,只能读,如果文件不存在或无法找到,fopen函数失败,返回NULL;

b.“w”:创建一个文本文件,只能写,若文件存在则被重写;

c.“a”:打开一个文本文件,只能在文件尾部添加,如果文件不存在或无法找到,则新建一个文件;

d.“r+”:打开一个文本文件,可读可写,文件必须存在,否则,fopen函数失败,返回NULL;

e.“w+”:生成一个文本文件,可读可写,若文件存在则被重写;

f.“a+”:打开一个文本文件,可读可写,但只能在尾部添加,如果文件不存在,则新建一个文件。

注意:“a”和“a+”在对待文件尾标记EOF时,有细微不同,a模式不会将原文件的EOF移除,而a+模式会移除原文件中的EOF。

如:fp=fopen(“x.com”,“rb”);

表示以二进制文件只读方式打开当前目录下的x.com文件。

判断是否打开成功:

FILE* fp=NULL;

fopen(“E:\\a.txt”,“r”);

if(fp==NULL)

{出错处理;}

else

{正确处理;}

 

(2)fclose:关闭文件

        形式: int  fclose(FILE*  fp);

 注:使用该函数关闭时,缓冲区的数据都会被丢掉,可有效释放资源

 

(3)feof:判断文件已经结束

     形式:int  feof(FILE*  fp);

     对文本文件进行读取时,如果达到文件末尾,将返回EOF(-1),,对于二进制来说,-1是合法的数据,故一返回EOF就停止,则会出现错误,用feof函数,若位置指针到达尾,返回1,否则返回0.

 

(4)fgets和fputs:字符读写函数

        形式:

   int  fgets(FILE* fpIn);

  int  fputs(int  c,  FILE*  fpOut);

其中,fpIn必须是以读或读写方式打开的文件指针,fpOut必须是以读、读写或追加方式打开的文件指针。若读写操作正确,fgets函数返回写入字符的ASCII码,否则返回EOF。

 

(5)fgets和fputs:字符串读写函数

     形式:

     Char*  fgets(char* str, int  n, FILE*  fpIn);

     Int  fputs(const  char* str, FELE *  fpOut);

 

例子:字符串输入输出函数

#include<stdio.h>

#include<conio.h>

void main(void)

{

       char str[100],FileA[50];

       FILE* fpO=NULL;

       printf("请输入一串字符:\n");

       gets(str);

       printf("要将该字符串保存在什么地方?\n");

       gets(FileA);

       fpO=fopen(FileA,"wt");

       if(fpO==NULL)

       {

              printf("输出文件打开失败,请检查");

              exit(0);

       }

       if(fputs(str,fpO)==EOF)

       {

              printf("字符串写入失败");

              exit(0);

       }

       fclose(fpO);

       getch();

}

//huangd(键盘输入)

//E:\A.txt(键盘输入)

 

Fgets函数实例:

//fgets();从文件中读入字符串

#include<stdio.h>

#include<conio.h>

#include<string.h> //使用Strlen

void main(void)

{

       char F[50]; //声明创建字符数组,用以保存文件位置

       char str[100]={'0'}; //保存读入的字符串

       FILE* fpI=NULL;  //输出用

       printf("要从哪个文件中读入字符串?\n");

       gets(F); 

       fpI=fopen(F,"rt");  //只读方式打开F指定的文件

    if(fpI==NULL) //防错

       {

              printf("输入文件打开失败,请检查");

              exit();

       }

       if(fgets(str,sizeof(str),fpI)==NULL)

       {

              printf("字符串读出失败");

              exit(0);

       }

       puts(str);  //将str显示在屏幕上,等价于fputs(str,stdout)

       fclose(fpI);

       getch();

}

 

(6)fread和fwrite:块读写函数

        分别 用于“从输入文件中读取一块数据到内存中”和“将内存中的一块数据写入到文件中”;

形式:

size_t  fread(void  *p, size_t  size,  size_t num,  FILE*  fpIn);

size_t  fwrite(const  void *p,  size_t  size, size_t  num,  FILE* fpOut);

 

例子:将一块内存数据写入文件中

#include<stdio.h>

#include<conio.h>

#define NUM 2

typedef struct

{

     char name[20];

     int age;

     char email[50];

} person;

voidgetInfo(person* pInfo)

{

     printf("请输入名字:");

     gets(pInfo->name);

     printf("请输入年龄:");

     scanf("%d",&pInfo->age);

     getchar();

     printf("请输入电子邮件:");

     gets(pInfo->email);

}

void main(void)

{

     int i;

     person People[NUM];

     FILE* fpO=NULL;

     char F[50];

     printf("保存在哪个文件?\n");

     gets(F);

     fpO=fopen(F,"wt");

     if(fpO==NULL)

     {

            printf("输出文件打开失败,请检查");

            exit(0);

     }

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

     {

            getInfo(&People[i]);  //获取用户输入

            //将当前person结构体变量占据的一块内存写入文件中

            if(fwrite(&People[i],sizeof(person),1,fpO)==0)

            {

                   printf("块写入失败");

             exit(0);

            }

     }

     printf("块写入成功");

     fclose(fpO);

     getch();

}

 

从文件中读一块数据到内存中:

   

#include<stdio.h>

#include<conio.h>   //使用getch();

#define NUM 2

typedef struct   //声明结构体person

{

       char name[20];

       int age;

       char email[50];

}person;

void display(person p1)  //显示人员信息的函数

{

       printf("Name:%s\n",p1.name);

       printf("Age:%d\n",p1.age);

       printf("Email:%s\n",p1.email);

}

void main(void)

{

       person People[NUM];  //声明结构体数组

       FILE* fpI=NULL;

       int i;

       char FileA[50];   //声明创建字符数组,用以保存文件位置

       printf("从哪个文件中读取数据?\n");

       gets(FileA);

   fpI=fopen(FileA,"rt"); //以文本只读方式打开FileA指定的文件

       if(fpI==NULL)   //防错处理

       {

              printf("输入文件打开失败,请检查");

              exit(0);

       }

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

       {

              if(fread(&People[i],sizeof(person),1,fpI)==0)//从文件中读取一块内存到People中

              {

                     printf("块读取失败");

                     exit(0);

              }

              display(People[i]);

       }

       fclose(fpI);

       getch();

}

//打开文件中内容要和person的定义一致,要不然会出现块读取失败

   (7)fprintf和fscanf:格式化文件输入输出

         “读写对象是磁盘文件而不是键盘和显示器”

形式:

Int  fprintf(FILE* const  char  *,…);

Int  fscanf(FILE* const  char  *,…);

    

例子:格式化文件输出实例fprintf

 //在E:\A.txt 中写入姓名和年龄

#include<stdio.h>

#include<conio.h>

void main(void)

{

    char FileA[50];

    FILE* fpO=NULL;

    char name[20];

    int age=0;

    printf("保存在哪个文件?\n");

    gets(FileA);

    fpO=fopen(FileA,"wt");

    if(fpO==NULL)

    {

           printf("输出文件打开失败,请检查");

           exit(0);

    }

 

    printf("请输入你的姓名:");

    gets(name);

    printf("请输入年龄");

    scanf("%d",&age);

    getchar();

    if(fprintf(fpO," %s%d",name,age)==EOF)

    {

           printf("写入失败");

           exit(0);

    }

    printf("写入成功");

    fclose(fpO);

    getch();

}

从文件中进行格式化输入:

#include<stdio.h>

#include<conio.h>

void main(void)

{

       char FileA[50];

       FILE* fpI=NULL;

       char name[20]={'0'};

       int age=0;

       printf("从哪个文件中读取");

       gets(FileA);

   fpI=fopen(FileA,"rt");

       if(fpI==NULL)

       {

              printf("输入文件打开失败....");

              exit(0);

       }

       fscanf(fpI,"%s%d",name,&age);

       printf("读取结果:姓名为%s,年龄为%d",name,age);

       fclose(fpI);

       getch();

}

 

(8)文件的定位

a.  rewind:移到开头

     形式:rewind(FILE* fp);

     其没有返回值;

b.  ftell:得到当前位置

形式:long  ftell(FILE*);

执行成功,返回当前文件指针的值,否则返回-1L(L表示该-1为long型常量)

c.  fseek:移动指针(重要)

用以控制、调整文件指针的值,从而改变下一次读写操作的位置;

形式:int  fseek(FILE*  fp, long  offset,  int startPos);

其中,fp是文件指针,startPos是起始点,offset是目标位置相对起始点的偏移量,可以为负数,如果成功,文件位置指针被设定为“起始点+offset”;

起始点设置有以下3种方式:

起始点       值          名称

 文件开始       0        SEEK_SET

 当前位置       1       SEEK_CUR

文件末尾      2        SEEK_END

注意:既可以使用0、1、2作参数传递给fseek函数,也可以使用名称;若执行正确,返回0…

例子://将字符串逆行输出

#include<stdio.h>

#include<conio.h>

void main(void)

{

     FILE* fp=NULL;

     int i;

     fp=fopen("E:\\test.dat","wb");

     if(fp==NULL)

     {

            printf("输出文件打开失败....");

            exit(0);

     }

     fputs("Beijing",fp);

     fclose(fp);

     fp=fopen("E:\\test.dat","rb");

     for(i=1;fseek(fp,-i,SEEK_END)==0;i++)

     {

            putchar(fgetc(fp));

     }

     fclose(fp);

     getch();

}

 

(9)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值