C语言文件处理

本文介绍了C语言中文件的概念,包括文本文件与二进制文件的区别,标准输入、输出和错误流的使用,以及文件操作函数如fopen、fclose、fscanf、fprintf等的详细讲解。重点涵盖了文本文件的写入、追加、读取以及二进制文件的随机存取,还提供了ftell和文件大小计算的方法示例。
摘要由CSDN通过智能技术生成

声明:本博客为参考他人博客和C语言书籍整理的,仅作为复习学习用,如有侵权,本人可即刻删除

1.文件与流

1.1文件

C语言中,文件是一个按顺序组成的字节流。文件会以文件结束标记(EOF)标记文件的结束。
文件分为文本文件二进制文件两种:
(1)文本文件是以字符编码的方式进行保存的。多是顺序存取方式。顺序读取也就是从上往下,一笔一笔读取文件的内容。保存数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件,而被存取的文件则称为顺序文件。扩展名为.txt的为文本文档。

(2)二进制文件适用于非字符为主的数据。如果以记事本打开,只会看到一堆乱码,多为随机存取方式。随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。
其实,除了文本文件外,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小,以及可随机存取数据

1.2程序中的标准流

当一个文件打开,就会有一个与这个文件联系在一起。当文件执行时,下面三个流被自动打开:
标准输入:stdin,接收来自键盘的输入。
标准输出:stdout,将信息显示在屏幕上。
标准错误:stdout,将出错信息显示在屏幕上。
每次打开一个文件都会返回一个指向FILE结构体类型的指针,FIFLE结构体类型包含了用于文件处理的信息。

2.文件操作函数

2.1文本文件操作

fopen(char* filename,*type)
//如fopen("C:\\tmp\\test.text","w")
/*
参数:
参数filename是文件路径及名称,例如"c:\\tmp\\test.text"即代表c盘下tmp文件夹的test.txt文件注意转义字符是两个斜杠'\\','\'是控制字符
参数*type是使用文件的方式

文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read):只读
w(write):只写
a(append):追加
t(text):文本文件,可省略不写
b(binary):二进制文件

(1)用'r'打开一个文件时,该文件必须已经存在,且只能从该文件中读出。

'r' == 'rt'
打开一个文件,文件必须存在,只允许读
'r+' == 'rt+'
打开一个文本文件,文件必须存在,允许读写

(2)用'w'打开的文件,只能向该文件中写入,若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。

'w' == 'wt'
新建一个文本文件,已存在的文件将内容清空,只允许写
'w+' == 'wt+'
新建一个文本文件,已存在的文件将内容清空,允许读写

(3)若要向一个已存在的文件追加新的信息,用'a'方式打开文件,如果指定文件不存在,则尝试创建该文件。

'a' == 'at'
打开或新建一个文本文件,只允许在文件末尾追写
'a+' == 'at+'
打开或新建一个文本文件,可以读,但只允许 在文件末尾追写

fopen()失败将会返回NULL
*/

fclose(FILE* fp)
/*
关闭打开的文件,关闭成功返回0,否则返回非0值
*/

fscanf(FILE* fp,...)
/*
格式化读取,从fp中格式化读取数据,与scanf相似
如fscanf(fp,"%s,%d",buff,&n)从fp中格式化读取数据到buff和n中
*/

fprintf(FILE* fp,...)
/*
格式化输出,格式化输出数据到fp中,与printf相似
如fprintf(FILE* fp,"%s,%d"buff,n)将buff和n格式化输出到fp中
*/

fgetc(FILE* fd)
//从目标文件中读入一个字符,例如fgetc(stdin)相当于getchar(),从标准输入中读入一个字符

fputc(const char* c,FILE* fd)
//向文件中写入一个字符,例如foutc('a',stdout)相当于putchar('a'),将字符'a'写入到标准输出中

fgets(char* str,int n,FILE* fp)
/*
从文件中读取n-1个字符,在最后设置'\0',放在str里面,所以放到str里n个字符,如果在读完n-1个字符之前遇到换行符或者EOF,读入结束。
*/

fputs(const char* str,FILE* fp)
/*
向指定文件输出一个字符串,str可以是字符串常量、字符数组名或字符型指针。若输出成功,则返回0,否则返回EOF。
*/

rewind(FILE* fp)
/*
使位置指针重返为位置的开头
*/

ferror(FILE* fp)
/*
调用各种函数(fread,fwrite,fgetc,fputc等)如果出现错误 ,可以用该函数检查,出现错误返回 true。
注意对同一个函数,每次调用输入输出函数,均产生一个新的ferror函数值,所以应当在调用一个输入输出函数后,立刻检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值会自动置为0。
*/

feof(FILE* fp)
/*
用来检查文件是否读取结束,读取结束返回true,反之返回false
*/

2.2二进制文件操作

fread(void* buff,size_t size,size_t count,FILE* stream)
/*
如:fread(buff,sizeof(char),25,stream)
从输入流中每个元素大小为sizeof(char),读取25个元素到buff中
给定输入流stream中,读取最多count个元素到数组buff中,若出现错误,则流的文件位置指示器的位置不确定。若没有完整的读入最后一个元素,则其值不确定。

参数:
buff,是指向接收数据的空间首地址的指针
size,读取的每个元素的大小(单位是字节)
count,要读取的元素的个数
stream:输入流

返回值:
返回成功读取的元素的个数,若出现错误或到达文件尾,则可能小于count。若size或count为0,则fread返回0且不进行其他动作。fread不区分文件尾和错误。可以用ferror()检测是否读取错误,feof()检测是否到达文件尾
*/

fwrite(const void* buff,size_t size,size_t count,FILE* stream)
/*
参数:
buff:指针,要输出数据的地址
size:要写入的字节数
count:要进行写入size字节的数据项的个数
stream:目标文件指针
*/

fseek(FILE* fp,long offset,int fromwhere)
/*
offset:移动的偏移量。如果为正数,表示从fromwhere开始向文件尾方向移动。如果是负数,表示从frommwhere开始向文件头方向开始移动
start:起始点。用0、1、2代替。
#define SEEK_SET 0//文件开始
#define SEEK_CUR 1//文件当前位置 
#define SEEK_END 2//文件结尾
*/

ftell(FILE* fp)
/*
用于得到文件位置指针当前位置相对于文件首的偏移字节数。
*/

二进制文件操作意思是函数以二进制形式对文件进行操作。
fwrite和fread可以用于文本文件的输入输出 。文本文件本质上仍然是二进制文件,仅仅是它保存的信息是些文本(比如 可显示的ASCII码,汉字等),这样文本编辑器就可以用“文本方式”查看和编辑内容,而不像二进制那样让人看不懂。

3解决问题

3.1ftell函数的使用

参考博客点击此处

3.2如求一个文件大小

#include<stdio.h>

int main()
{
	FILE* fp = NULL;
	fp = fopen("C:\\tmp\\test2.txt","r");

	fseek(fp, 0, 2);//将fp指针指向文件最后
	printf("%d\n", ftell(fp));//计算偏移量
	
	fclose(fp);
}

查看文件操作函数详解博客请点击此处

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟小胖_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值