c语言的文件操作

C语言的文件操作

1、C语言文件操作包括文本,二进制文件操作。如下:打开,关闭,读写字符,读写字符串,读写数据块,文件位置指针定位。
C语言对于文本文件和二进制文件的操作函数列表如下:

文本文件二进制文件
打开,关闭:打开,关闭
fopen(),fclose()fopen(),fclose()
读写字符:以二进制形式读取一个整数
fgetc(),fputc()getw(),putw ()
读写字符串读写数据块:
fgets(),fputs()fread(),fwrite()
读写数据块:-
fscanf(),fprintf(),fread(),fwrite()-
文件检查函数
feof(),ferror(),clearerr(),ftell();
文件定位函数
rewind(),fseek()

文件的打开与关闭:

fopen();
fclose();
函数原型以及功能说明:
(1)FILE *fopen(char *pname,char *mode);

mode(打开方式):
r:打开一个文本文件只读
w:打开一个文本文件只写
a:对一个文本文件添加
rb:打开一个二进制文件只读
wb:打开一个二进制文件只写
ab:对一个二进制文件添加
r+:打开一个文本文件读/写
w+:生成一个文本文件读/写
a+:打开一个文本文件读/写
rb+:打开二进制文件读/写
wb+:生成二进制文件读/写
ab+:打开二进制文件读/写

按照mode 规定的方式,打开由pname指定的文件。若找不到由pname指定的相应文件,就按以下方式之一处理:

  • (1) 此时如mode 规定按写方式打开文件,就按由pname指定的名字建立一个新文件;
  • (2) 此时如mode规定按读方式打开文件,就会产生一个错误。
    (题外话,FILE结构体定义:)
#ifndef _FILE_DEFINED
struct _iobuf {
    char *_ptr; //文件输入的下一个位置
    int _cnt; //当前缓冲区的相对位置
    char *_base; //指基础位置(即是文件的起始位置) 
    int _flag; //文件标志
    int _file; //文件描述符id
    int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
    int _bufsiz; //文件缓冲区大小
    char *_tmpfname; //临时文件名
      };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif

打开文件的作用是:
(1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
(2)开辟一个缓冲区;
(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
返回值
正常返回:被打开文件的文件指针。
异常返回:NULL,表示打开操作不成功。
要说明的是:C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准出错 stderr。
fclose()函数:
1. 函数原型
int fclose(FILE *fp);
函数参数说明:fp是即将要关闭的文件指针。
正常返回:0。
异常返回:EOF,表示文件在关闭时发生错误。

读写字符与字符串:

四个函数原型如下:
int fgetc(FILE *fp);
int fputc(int ch,FILE *fp)
char *fgets(char *str,int n,FILE *fp)
int fputs(char *str,FILE *fp)
当获取一个字符时,fgetc就获取fp所指向的文件中的一个字符,从第一个开始,每次获取一个fp自动向下移动一个字符。

FILE *fp;
char c = 0;
fopen_s(&fp,"Hellofish.txt","r");//"Hellofish.txt"文件中内容是Fish
c = fgetc(fp);//获取F
putchar(c);
c = fgetc(fp);//获取i
putchar(c);
c = fgetc(fp); //获取s
putchar(c);
putchar('\n');
system("pause");

执行结果如下:
在这里插入图片描述
当获取字符串时使用的fgets从指定的文件中获取n个字符,存储在缓存区str中,返回str的首地址。
fputs则是将str缓存内的字符串写入到fp文件。成功时返回值为0,失败返回为EOF。

读写一个整数

int getw(FILE *fp);
int putw(int n,FILE *fp);
getw是从二进制文件中获取一个int整数。putw则恰恰相反,是向文件中写入一个整数。但是要注意二进制文件中就会存在-1,不能使用EOF,而必须使用feof函数来判断是否到达文件末尾。代码应用如下:

FILE *fp;
int ch = 0x30313233;
int a = 0, b = 0;
fopen_s(&fp,"Hellofish.txt","rb+");
a=_putw(ch, fp);
rewind(fp);
b=_getw(fp);
if (feof(fp))
{
	printf("已经到了文件末尾,重新开始\n");
	exit(1);
}
printf("a:%#.8x,\n",a);
printf("b:%#.8x\n", b);
system("pause");

执行结果如下:
在这里插入图片描述

读写数据块

  • fscanf();
  • fprintf();
    函数原型:
    int fprintf(FILE *fp,char *format,arg_list);
    int fscanf(FILE * stream, const char * format, [argument…]);
    使用范例:
char name[100] = { 0 };
int a = 0;
fscanf(stdin,"%s %d", name,&a);
fprintf(stdout,"%s,%d\n",name,a);
system("pause");

但是要注意的一个问题:fscanf的format中%s与%d之间不能有逗号隔开不然会出问题,至于原因,我也不知道,,按道理是可以的吧,然而实践证明就是不可以,那就是不可以。

  • fread();
  • fwrite();
    函数原型:
    size_t fread(
    void *buffer,
    size_t size,
    size_t count,
    FILE *stream
    );
    size_t fwrite(
    void *buffer,
    size_t size,//size_t就是unsigned int
    size_t count,
    FILE *stream
    );
    这两个函数很简单,从文本文件或者二进制文件中读写count个单元,每个单元大小是size,到自己定义的缓冲区。应用代码如下:
	char name[100] = { 0 };
	char buffer[100] = { 0 };
	int a = 0, i = 0, j = 0;
	FILE *fp;
	printf("输入结果:");
	scanf_s("%s",name,100);
	fopen_s(&fp, "Hellofish.txt", "r+");//以可读可写打开一个名称为"Hellofish.txt"的文件
	i = sizeof(char);
	j = strlen(name);
	fwrite(name, i, j, fp);//将输入的name数组输入文件
	rewind(fp);//重新将fp指针定位到文档开头
	fread(buffer, i, j, fp);//从文件中读count个单元,每个单元大小是size,到buffer
	fprintf(stdout, "输出结果%s\n", buffer);
执行结果:

在这里插入图片描述

文件检查函数:

  • feof();
    原型:int feof(FILE *fp)
    用来判断二进制文件是否到达末尾。
  • ferror();
    原型:int ferror(FILE *fp)
  • clearerr();
    原型:void clearerr(FILE *fp)
  • ftell();
    原型:long ftell(FILE *fp)

文件定位函数

rewind();
原型:void rewind(FILE *fp)
fseek();
原型:int fseek(FILE *fp,long offset,int base)
使文件指针fp移到基于base的相对位置offset处
base必须是SEEK_CUR,SEEK_END或者SEEK_SET。如果移位成功,返回值为0,否则返回值非0。
ftell();
原型:long ftell(FILE *fp)
取得由fp指定文件的当前读/写位置,该位置值用相对于文件开头的位移量来表示。正常返回一个长整型,异常返回-1。
代码应用:

	FILE *fp;
	errno_t err;
	long a,b;
	int i = 0;
	char name[100] = {0};
	scanf_s("%s",name,100);
	err=fopen_s(&fp,"Hellofish.txt","r+");
	if (err)return err;//如果打开文件失败,返回失败代码
	b=ftell(fp);//获取fp当前位置
	printf("b:%ld\n",b);//打印出fp当前位置
	fwrite(name,sizeof(char),strlen(name),fp);//将输入的name内容写入到fp指向的文件中
	a = ftell(fp);//再次获取fp当前位置
	printf("first a:%ld\n", a);
	i = -1;
	fseek(fp, i, SEEK_CUR);//从当前位置移动fp-1个单位。
	a = ftell(fp);//再次获取fp的位置
	printf("second a:%ld\n", a);

执行结果如下:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值