C语言文件操作学习

本文详细介绍了C语言中文件的分类、不同类型的文件操作(如流、标准流、缓冲区、文件指针等)、打开与关闭文件的方法、各种模式的含义以及文件读写的函数,包括fgetc、fputc、fgets、fputs、fscanf、fprintf、fread和fwrite等。同时探讨了如何使用feof判断文件结束和文件指针定位技巧。
摘要由CSDN通过智能技术生成

文件分为  
程序文件  数据文件
程序文件  
分为目标文件(windows环境下后缀为.obj)  可执行程序(windows环境下后缀为.exe)  源程序文件(后缀为.c)
数据文件根据数据的组织形式 分为二进制文件文本文件
二进制文件 在内存中数据是以二进制的形式存储,不加转化直接输出到外存,就叫做二进制文件。
文本文件在存储到外存前转换以ASCII字符的形式存储的⽂件就是文本文件。字符是直接以ASCII形式存储的,数值是既可以二进制的形式存储,也可以以ASCII的形式存储。
例子:10000  以二进制存储占用4个字节    
00000000
00000000
00100111
00010000
以ASCII储存是占用5个字节   
00110001
00110000
00110000
00110000
0011000
文件的操作
流:程序在输出到外部设备和获取外部资料的时候,不同的设备输入输出的操作方式不同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念。
标准流 :C语言程序在运行时默认打开三个流 stdio(标准错输入), stdout(标准错输出) ,stderr(标准错误流)。
文件的缓冲区
ANSI C标准采用“缓冲文件系统”处理数据文件,所谓的文件缓冲系统就是,指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区,数据存储到这个个空间当中,当数据存储满了,再一次行向磁盘输送。如过从磁盘中读取数据,也是先向缓冲区输入数据,缓冲区满后在输入到程序的变量当中。每一个文件在内存中只有一个缓冲区,在向文件输出数据时,它就作为输出缓冲区,在从文件输入数据时,它就作为输入缓冲区。
文件指针
文件缓冲系统当中,关键的概念时文件类型指针,简称后文件指针
每个文件打开时都会在内存中创建一个文件信息区,里面存放着文件的各种信息(当前位置,文件名,状态等),这些信息保存在结构体变量中,结构体变量名由系统声明,称为FILE。
#include<stdio.h>
#include<string.h>
struct _iobuf{
 char *_ptr;
 int _cnt;
 char *_base;
 int _flag;
 int _file;
 int _charbuf;
 int _bufsiz;
 char *_tmpfname;
};
typdef struct _iobuf FILE ;
Int mian{
Return 0;
}

通过FILE指针来维护这个结构体变量 会更加的方便。
文件的打开与关闭
fopen(const char * filename, const char * mode);// 文件路径文件名 和打开模式
fclose(const char * filename);//关闭文件
打开模式
文件使用方法
含义
如果制定文件不存在
“r”(只读)
为了输⼊数据,打开⼀个已经存在的⽂本⽂件
出错
“w”(只写)
为了输出数据,打开⼀个⽂本⽂件
建⽴⼀个新的⽂件
“a”  (追加)
向⽂本⽂件尾添加数据
建⽴⼀个新的⽂件
“rb”(只读)
为了输⼊数据,打开⼀个⼆进制⽂件
出错
“wb”(只写)
为了输出数据,打开⼀个⼆进制⽂件
建⽴⼀个新的⽂件
“ab”(追加)
向⼀个⼆进制⽂件尾添加数据
建⽴⼀个新的⽂件
“r+”(读写)
为了读和写,打开⼀个⽂本⽂件
出错
“w+”(读写)
为了读和写,新建⼀个⽂本⽂件
建⽴⼀个新的⽂件
“a+”(读写)
打开⼀个⽂件,在⽂件尾进⾏读写
建⽴⼀个新的⽂件
“rb+”(读写)
为了读和写打开⼀个⼆进制⽂件
出错
“wb+”(读写)
为了读和写,新建⼀个新的⼆进制⽂件
建⽴⼀个新的⽂件
“ab+”(读写)
打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写
建⽴⼀个新的⽂件
例子
#include<stdio.h>
Int mian( ){
FILE*fp=fopen("srudent.txt" , “w”);//打开一个文件用指针fp来接收文件的,该指针指向student文件。
fputs(“hello world”,fp);
flclose(fp);//关闭文件
fp=NULL;//把fp指针置为空指针,不然文件关闭了fp就指向无效的空间成为野指针。
return 0;}
 
顺序读写函数介绍
函数名
功能
适用于
fgetc
字符输入函数
所有输入流
fputc
字符输出函数
所有输出流
fgets
文本行输入函数
所有输入流
fputs
文本行输出函数
所有输出流
fscanf
格式化输入函数
所有输入流
fprintf
格式化输出函数
所有输出流
fread
二进制输入
文件
fwrite
二进制输出
文件
#include<stdio.h>
typedef struct Student
{
int age;
char name[10];
} Student;
int main(){
FILE *wp = fopen("student.txt", "w");
int i = 0;
for (i = 0; i < 10; i++)
{
fputc('a' + i, wp);//循环输出a-j到student文件
}
fclose(wp);
wp = NULL;
FILE *rp = fopen("student.txt", "r");
int a = 0;
i = 0;
char ch[20] = {0};
while ((a = fgetc(rp)) != EOF)//如果读到EOF说明已经读到文件末尾处
{
ch[i] = a;
i++;
}
printf("%s", ch);
fclose(rp);
rp = NULL;
//把ate文件中的数据拷贝ate_cppy中
FILE *pwrite = fopen("/Users//leiyuye/desktop/ate.txt", "w"); //\转译 写
fputs("qwertyu", pwrite);
fclose(pwrite);
pwrite = NULL;
FILE *pwrite2 = fopen("/Users//leiyuye/desktop/ate.txt", "r"); // 打开ate文件只读
FILE *pread = fopen("/Users//leiyuye/desktop/ate_copy.txt", "w");
fgets(ch, 7, pwrite2);
fputs(ch, pread);
fclose(pread);
pread = NULL;
fclose(pwrite2);
pwrite2=NULL;
//标准格式输入输出
Student s = {12, "zhangshan”};
Student t = {0};
// 把结构体Student s 的数据写到文件 student.txt中
FILE *pswrite = fopen("student.txt", "w");
fprintf(pswrite, "%d %s", s.age, s.name); // 输出到文件当中
fclose(pswrite);
pswrite = NULL;
// 把student.txt中的数据存读到 结构体Student t中
FILE *psread = fopen("student.txt", "r");
if (psread == NULL)
{
printf("%s\n", strerror(errno));
}
fscanf(psread, "%d %s", &(t.age), t.name); // 把psread指向的文件中的数据 格式化输入到结构体t中。
fprintf(stdout, "%d %s", t.age, t.name);
// printf("%d %s", t.age, t.name);
fclose(psread);
psread = NULL;
//fread 和 fwrite
int a=10000;
FILE* rp=fopen(“asd.txt”,“r”);
fwrite(&a,4,1,rp);
fclose(ep);
ep=NULL;
int as=0;
FILE* wp=fopen(“asd.txt”,“w”);
fread( &as,4,1,wp);
fclose(wp);
wp=NULL;
return 0;
}
文件指针的位置
函数名
功能
参数
int fseek(FILE * stream, long int offset, int origin );
根据文件指针的位置和偏移量来定位文件的指针
文件流  偏移量  偏移量的位置
long int ftell(FILE * stream);
返回指针位置相对于与起始位置的偏移量
文件流
void rewind(FILE * stream);
文件指针回到起始位置
文件流
#include<stdio.h>
int main( ){
FILE*p=fopen(“student.txt”, "wb”);
fputs(“abcdef”,p);
fseek(p1,3,SEEK_SET);//把指针位置 从文件头开始向后便宜3个位置
fputs(“kk”,p1);//de 变成 kk
rewind(p);//指针回到起始位置
fputs(“kk”,p1);//ab 变成 kk
ftell(p);//返回指针位置与起始位置的偏移量 值为2
fclose(p);
p=NULL;
//int origin(起始位置)SEEK_SET  SEEK_CUR  SEEK_END   文本头 文件当前位置 文件尾
//long int offest(参数) 可以是正也可以是负 正向后 负向前
//FIlE*stream 文件流
return 0;
}
文件读取的判定
        feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0。  
        文档的结尾都有一个隐藏字符”EOF”,当程序读取它的时候,就会知道文件已经到达结尾。feof工作原理站在光标所在位置,向后看看还有没有字符。如果有,返回0;如果没有,返回非0。所以当打开空文件,feof函数在光标处会向后看,发现是有个EOF字符,所以返回0。
         牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。
1.⽂本⽂件读取是否结束,判断返回值是否为 EOF  fgetc ),或者 NULL  fgets 
例如:
fgetc 判断是否为 EOF . fgets 判断返回值是否为 NULL .
2.二进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
例如:fread判断返回值是否⼩于实际要读的个数。
#include<stdio.h>
enum{SIZE=5};
int main(){
FILE*pf=fopen(“asd.txt”.”r”);
int a=0;
while((a=getc(pf))!=EOF){
   putchar(a);
}
if(ferror(pf))//判断文件是否正常结束 正常结束的话返回0 不正常返回一个非零的数
{
puts("I/O error when reading);
}
else if(feof(pf)//如果没有到文件尾,返回0;到达文件尾 返回一个非零值
{
puts(""End of file reached successfully);
}
fclose(pf);
pf=NULL;
double a[size]={1.,2.,3.,4.,5.};
FILE*pdw=fopen(“num.txt”,”wb");
int n=0;
fwrite(&a,sizeof *a,size,pdw);
fclose(pdw);
pdw=NULL;
double b[size]={0};
FILE*pdr=fopen(“num.txt”,”rb”);
size_t nums=fread(&a,sizeof *a,size,pdr);
if(nums==size){
puts("Array read successfully, contents: ");
for(int n = 0; n < SIZE; ++n) {
printf("%f ", b[n]);
putchar('\n’);
}
else { 
if (feof(per))
printf("Error reading test.bin: unexpected end of file\n");
else if (ferror(per)) {
perror("Error reading test.bin");
}
}
fclose(pdr);
pdr=NULL;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值