文件概述

文件:存储在外部介质上数据的集合,是操作系统数据管理的单位

文件分类:

1.按文件的逻辑结构:
记录文件:由具有一定结构的记录组成(定长和不定长)
流式文件:由一个个字符(字节)数据顺序组成按存储介质:
普通文件:存储介质文件(磁盘、磁带等)
设备文件:非存储介质(键盘、显示器、打印机等)
2.按数据的组织形式:
文本文件: ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放

一,基础函数

1.打开文件函数

FILE fopen( const char filename, const char mode );
作用:打开一个指定的文件进行操作。
在这里,filename 是字符串,用来命名文件,访问模式 *mode
的值可以是下列值中的一个:

模式 描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
“rb”, “wb”, “ab”, “rb+”, “r+b”, “wb+”, “w+b”, “ab+”, “a+b”
注意:若打开失败会返回NULL
所以对文件操作前要进行判断文件是否打开成功。

  1. FILE *in;
  2. char name[200]="C:/Users/虚无/Desktop/aaa.txt";
  3. in=fopen("C:/Users/虚无/Desktop/aaa.txt","w");
  4. if(in==NULL){
  5. printf("文件打开失败!");
  6. exit(0);
  7. }

2.关闭文件

int fclose( FILE fp );
作用:对文件操作完毕后关闭文件。
如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 *stdio.h
中的常量。
image.png

if(fclose( FILE *fp )!=EOF){
  printf("关闭成功");
}
else
  printf("关闭失败");

3.判断读取文件是否读取完
int feof(FILE *fp);
如果已到文件尾则返回非零值, 其他情况返回0. 返回值:返回非零值代表已到达文件尾

if(feof(FILE *fp)!=0){
        printf("到尾部!"); 
    }

一,文件写入

image.png

1.字符I/O:fputc与fgetc

每次对一个字节进行操作

fputc

函数原型:int fputc(int c, FILE *fp)
功能:把一字节代码c写入fp指向的文件中返值:正常,返回c;出错,为EOF

fgetc

fgetc函数原型:int fgetc(FILE *fp)
功能:从fp指向的文件中读取一字节代码返值:正常,返回读到的代码值;读到文件尾或出错,为EOF
文件保存:

#include <stdio.h>
#include<stdlib.h>
int main()
{  FILE *fp;
    char ch,filename[10]="out.txt";
    if((fp=fopen(filename,"w"))==NULL)
    {   printf("文件打开失败!\n");
    exit(0);
    }
    printf("请输入内容,#代表结束:");
    ch=getchar();
    while(ch!='#')
    {    fputc(ch,fp);
          putchar(ch);//把保存的内容打印出来 
          ch=getchar();//读取下一个字符 
    }
    fclose(fp);
}
#include <stdio.h>
#include<stdlib.h>
int main()
{  FILE *fp;
    char ch,*filename="out.txt";
    if((fp=fopen(filename,"r"))==NULL)
    {   printf("打开文件失败\n");
         exit(0);
    }
    while((ch=fgetc(fp))!=EOF)
        putchar(ch);
    fclose(fp);
}

数据块(一组数据)I/O: fread与fwrite

函数调用形式
fread (buffer, size, count, fp)
fwrite(buffer, size, count, fp)
功能:读/写数据块返值:成功,返回读/写的块数;出错或文件尾,返回0说明:buffer: 指向要输入/输出数据块的首地址的指针size: 每个要读/写的数据块的大小(字节数)count: 要读/写的数据块的个数fp: 要读/写的文件指针fread与fwrite 一般用于二进制文件的输入/输出

I/O:fprintf/fscanf

fscanf(文件指针,格式字符串,输入表列);
fprintf(文件指针,格式字符串,输出表列);
功能:按格式对文件进行I/O操作
返值:成功,返回I/O的个数;出错或文件尾,返回EOF
printf:显示,打印函数,显示到屏幕上
fprintf:显示,打印函数,打印到文件里
scanf:,读取,从设备读取到缓冲区。
fscanf:,读取,从文件读取到缓冲区里。
例 fprintf(fp,“%d,%6.2f”,i,t); //将i和t按%d,%6.2f格式输出到fp文件
fscanf(fp,“%d,%f”,&i,&t); //若文件中有3,4.5 ,则将3送入i, 4.5送入t

#include <stdio.h>
#include<stdlib.h>
int main()
{ char s[80],c[80];
   int a=1,b=3;
   printf("输入一串字符:");
   scanf("%s",s);
   FILE *fp;
   if((fp=fopen("test","w"))==NULL)
   {   
   printf("文件打开失败!");   
   exit(0);   
   }
   fprintf(fp,"%s  %d",s,a);/*write to file*/
   fclose(fp);
   if((fp=fopen("test","r"))==NULL)
   {    puts("can't open file"); 
        exit(0);
    }
   fscanf(fp,"%s%d",c,&b);/*read from file*/
   printf("%s %d",c,b);
   fclose(fp);
}