c语言中文件操作有什么作用是什么意思,C语言文件操作总结

首先我们来看一下文本文件与二进制文件的区别:

简单来说,文本文件就是按照字符编码的文件.常见的编码形式如ASCII编码和Unicode编码,比如说,字母A用ASCII编码是十进制的65,二进制的01000001;字符0用ASCII编码是十进制的48,二进制的00110000.计算机会根据储存信息与编码的对应关系进行解析.而二进制文件则是值编码的,就是说,01000001就是01000001(65),至于它具体表示什么,就由不同的文件格式来决定了.

在C语言中,可以通过fopen函数来打开一个文件:

FILE *fp=fopen(path,mode);

其中FILE是一个结构体,储存着文件的相关信息.path和mode都是const char*类型的,path是文件的路径,可以是相对路径也可以是绝对路径(注意c语言中'\'代表转义,因此windows下的路径中的'\'可以用"\\"来代替,也可以用'/'来代替),mode是打开的模式,如果没有正确打开文件,fopen会返回NULL,因此在使用文件操作以前简单的判断一下文件是否打开是很有必要的.针对文本文件与二进制文件的不同可以选择不同的打开模式:

mode

含义

说明

r

以只读方式打开一个(文本)文件

该文件必须存在;

w

以只写方式打开一个(文本)文件

若文件存在则长度清为 0,即该文件内容消失;

若不存在则创建该文件;

a

以只写及追加的方式打开一个(文本)文件;

从文件尾追加数据;

若文件不存在,则会建立该文件;如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留;

r+

以读/写方式打开一个(文本)文件

不改变文件内容;

w+

以读/写方式打开一个(文本)文件

若文件存在则长度清为 0,即该文件内容消失;

若不存在则创建该文件;

a+

以读/写及追加的方式打开一个(文本)文件;

从文件尾追加数据;

若文件不存在,则会建立该文件;如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留;

如果是二进制文件的话:

mode

含义

说明

rb

以只读方式打开一个二进制文件

该文件必须存在;

wb

以只写方式打开一个二进制文件

若文件存在则长度清为 0,即该文件内容消失;

若不存在则创建该文件;

ab

以只写及附加方式打开一个二进制文件;

从文件尾追加数据;

若文件不存在,则会建立该文件;如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留;

rb+

以读/写方式打开一个二进制文件

不改变文件内容;

wb+

以读/写方式打开一个二进制文件

若文件存在则长度清为 0,即该文件内容消失;

若不存在则创建该文件;

ab+

以读/写及追加方式打开一个二进制文件;

从文件尾追加数据;

若文件不存在,则会建立该文件;如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留;

当文件使用完毕后,就需要使用fclose函数关闭文件

fclose(fp);

关闭文件的过程,其实就是之前创建的FILE类型的结构体的释放过程,因此在关闭文件之后就不要再使用fp指针了.

下面来谈一下有关文件的操作:

首先是对文件内容的读取与写入.常用的函数有很多,首先来看一看fprint函数与fscanf函数.fprintf与printf函数的唯一的不同就是printf使用向stdout(标准输出)写东西,而fprintf则是有第一个参数指定要写入的内容.第一个参数要求是FILE类型的指针,指向你想要写入的流.当然,你也可以使用stdout,stderr作为参数.

FILE *fp=fopen("test.txt","w");if(fp!=NULL){

fprintf(fp,"Hello,world\n");

}

对于fscanf函数,其基本操作与scanf几乎一样,也就不再赘述了.

此外,对于单个字符的输入输出还有其单独的函数.

输出的函数:putchar(),putc,fputc;

int c='a';

FILE*fp=fopen("test.txt","w");

putchar(c);//putchar向stdout输出字符

fputc(c,fp);

putc(c,fp);//putc与fputc向test.txt写入字符

那么putc与fputc有什么区别呢?事实上fputc是一个函数,而putc是一个宏,putc的速度要快于fputc.如果出现错误,上述三个函数都会返回EOF,否则他们会返回写入的字符.

写入的函数:getchar,fgetc,getc:

FILE *fp=fopen("test.txt","w");int ch;//要注意这些函数的返回值其实是int型的,输入时变换一下格式就好啦

ch=getchar();//从stdin里读入一个字符

ch=fgetc(fp);

ch=getc(fp);//fgetc与getc从test.txt读入字符

getc是宏而fgetc是函数,getc的速度快于fgetc.

当到达文件末尾时,这几个函数都会返回EOF.

此外还有一种特殊的函数->ungetc,这个函数能够把从流中读到的字符放回去!比如,现在我想读入一系列数字:

while(isdigit(ch=getc(fp)){

...;

}

ungetc(ch,fp);

但是ungetc函数很容易出错,等我们讲到文件定位函数再说这个问题.

如果想要读入一行完整的字符串,就要使用fputs与fgets了.

puts("hello,world");//向stdout里写入,会再输出"hello,world"后自动添加换行符

fputs("hello,world",fp)//向文件写入,不会自动添加换行符

charstr[MAX_SIZE];

gets(str);//从stdin里面读入字符串,遇到换行符停止并丢弃换行符

fgets(str,sizeof(str)-1,fp);//fgets函数可以限制要储存的字符个数//而且fgets函数不会丢弃换行符

//gets与fgets在读到文件尾时会返回NULL

如果想要在二进制文件中操作比较大的文件块,就要用到fread与fwrite函数了.

fwrite函数用于把一个数组内的元素写入文件,使用时第一个参数是数组(首元素)的地址,第二个参数是数组每个元素的大小,第三个参数是要写入的元素的个数,第四个参数是数组大小.

//a是数组的名字

fwrite(a,sizeof(a[0]),sizeof(a)/sizeof(a[0]),fp);

显然,我们可以通过改变第二和第三个参数使得只有数组的一部分被写入文件.

fwrite函数的返回值是成功写入的元素(不是字节)个数,正常情况下等于第三个参数,除非发生了错误.

fread函数用来把文件中的某些内容读到数组中去使用与fwrite函数类似,返回读入的元素(不是字节)个数,如果出错(或者读到了文件的末尾)其返回值会小于第三个参数.

fread(a,sizeof(a[0]),sizeof(a)/sizeof(a[0]),fp);

其实这两个函数不仅仅可以用于数组,它们理论上可以用于任何数据类型,尤其是用于结构时居多:

typedef structStudent{intscore;intid;char *name;

}studenr;intmain(){

student s={70,201900130001,"bart"),s1;

fwrite(&s,sizeof(s),1,fp);

fread(&s1,sizeof(s),1,fp);return 0;

}

但是要小心一点,如果结构里面有指针,读入的指针可能会失效.

最后来看一下文件定位的问题.

当我们打开一个新的文件时,是不是可以开到一个"光标"?文件指针就相当于光标,它被用来定位当前文件要操作的字符.在Unix中,文件会有两个不同的指针->读指针与写指针.但在windows环境下这两个指针被合并了.当我们以读或者写模式打开文件时,"光标"在文件开头,并随着读或者写操作的进行而自动后移.如果是附加模式的话,文件位置在文件的末尾.调用fseek函数可以实现光标位置的转移.

1 fseek(fp,0L,SEEK_SET);

fseek函数的第一个参数是文件指针,第二个参数是offset,即从初始位置开始的偏移量(注意这里是long类型的).第三个参数负责调整初始位置,在stdio.h里面定义了三个宏,分别表示三个不同的起始位置可选量:

1 #define SEEK_SET 0

2 #define SEEK_CUR 1

3 #define SEEK_END 2

4 //分别表示文件的初始位置,文件的当前位置,文件的末尾

当发生错误时,fseek会返回非零值,否则返回0.

要注意的是,fseek函数一般用于二进制文件,此时offset量是字节数.但如果要用于文本文件,第二个参数一般要设成0,只利用fseek函数移动到文件末尾.如果必须要用到fseek函数,那么还得通过另一个函数------ftell,来获得offset的大小.

long file_pos=ftell(fp);

ftell返回当前文件的位置,数据类型是long.这个数字可以用于fseek函数的参数.如果文件时二进制文件,则返回值是以字节为单位计数的;如果是文本文件呢?这个就不甚清晰了.

此外还有rewind函数,作用是把文件位置设置在文件开头.

rewind(fp);

此外还有一些其它的文件操作,比如重命名与删除:

rename("test","test1");//把test重命名为test1

remove("test1.txt");//删除文件

此外还有一种文件输入输出利器:文件重定向.它常常与stdin,stdout联系起来:

freopen("C:\\project\\test.txt","r",stdin);//把标准输入从定向到test.txt

feropen("C:\\project\\test1.txt","w",stdout);//同理

如果用完文件后还想从键盘接收输入,就把stdin重定向到控制台:

freopen("CON", "r", stdin);//CON表示控制台

freopen("CON", "w", stdout);//千万不要直接关闭stdin啊,否则程序是不会接受键盘输入的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值