文件:
一、文件分类
在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。
1、程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀 为.exe)。
2、数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
以前大多数处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。
二、文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
三、文件类型
分为两类:
1、二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
2、文本文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
文件操作:
一、文件的打开、关闭常用接口
1、文件的打开(使用fopen这个函数)
FILE* file;
file = fopen("文件名","方式");
方式都有哪些呢?
如果在后面附加 “b” ,则表示打开的是二进制文件。
2、文件的关闭(使用fclose这个函数)
fclose(文件指针);
二、C语言文件读、写操作常用接口
- 1、读操作
- fgetc 函数 (从指定文件读入一个字符)
fgetc(文件指针);
- fread 函数(从指定文件读入一组数据)
fread(buffer, size, count, file);
这几个参数都是干什么的呢?
1、buffer 存放被读入数据的内存首地址
2、size 每个数据项的字节数
3、count 数据项个数
4、file 文件类型的指针,也就是从哪个文件中读
- fscanf 函数(从指定的文件中格式化读入数据)
fscanf(文件指针,格式控制,地址表);
这些读文件的方式在代码里怎么运用呢?
#include<stdio.h>
int main()
{
FILE *file;
//1.txt 为 测试文件
file = fopen("1.txt","r");
char a;
char b[3];
int c;
if(file != NULL){
a = fgetc(file);
fread(b,sizeof(char),3,file);
fscanf(file,"%d",&c);
}
putchar(a);
for(int i = 0; i < 3; i++){
printf(" %c",b[i]);
}
printf(" %d",c);
//一定不要忘了关闭文件
fclose(file);
return 0;
}
2、写操作
- fputc 函数(将一个字符写到指定的文件中,若写成功返回以输出字符,否则返回 EOF)
fputc( int , FILE* );
- fwrite 函数(将一组数据写到指定的文件中)
fwrite( buffer, size, count, file);
这四个参数的含义同读操作里的fread函数的参数含义。
- fprintf 函数(格式化写数据到指定的文件中)
fprintf(文件指针,格式控制,输出表);
文件的写操作在代码里又是如何体现的呢?
#include<stdio.h>
int main()
{
FILE *file;
//1.txt 为空
file = fopen("1.txt","w+");
char a0 = 'D';
char b0[3] = {'e','m','o'};
int c0 = 2;
char a1;
char b1[3];
int c1;
if(file != NULL){
// 输出
fputc(a0,file);
fwrite(b0,sizeof(char),3,file);
fprintf(file,"%d",c0);
// 读写指针移动到文件开头
rewind(file);
// 读入
a1 = fgetc(file);
fread(b1,sizeof(char),3,file);
fscanf(file,"%d",&c1);
}
// 打印结果
putchar(a1);
for(int i = 0; i < 3; i++){
printf(" %c",b1[i]);
}
printf(" %d",c1);
//一定不要忘了关闭文件
fclose(file);
return 0;
}
三、文件定位操作的常用接口
- rewind 函数(将文件的读写指针移动到文件的开头)
rewind(文件指针);
- fseek 函数(将文件的读写指针移动到文件的指定位置)
fseek(文件指针,偏移量,起始位置);
参数说明:
1、偏移量的类型为长整型
2、起始位置是指移动文件读写指针的参考位置,有以下三个值
- SEEK_SET 或 0 表示文件首
- SEEK_CUR 或 1 表示当前读写的位置
- SEEK_END 或 2 表示文件尾
- ftell 函数(返回文件的当前读写位置,若出错返回(-1L))
ftell(文件指针);
附注:
文件操作的一般流程很容易让人记混淆,这里我整理在一份代码里,方便记忆:
#include <stdio.h>
int main()
{
FILE *fp;
char ch ;
char buf[20]={'0'} ;
int temp = 0;
//以读的方式打开文件,同时判断是否打开成功
if((fp = fopen("1.txt","r")) == NULL)
{
printf("Fail to Open file 0\n");
return -1;
}
//获取文件中的数据
while((ch = getc(fp)) != EOF)
{
//假如文件中包含2,3,4则将其换为*
if(ch == '2'||ch == '3'||ch == '4')
buf[temp] = '*';
else
buf[temp] = ch;
temp ++;
}
//关闭文件
if(fclose(fp) == EOF)
{
printf("Close fail\n");
return -1;
}
//以写的方式打开文件
if((fp = fopen("1.txt","w")) == NULL)
{
printf("Fail to Open file 1\n");
return -1;
}
//将数据写入文件
for(temp = 0;buf[temp]!= '0';temp++)
putc(buf[temp],fp);
//关闭文件
if(fclose(fp) == EOF)
{
printf("Close fail\n");
return -1;
}
return 0;
}