栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C】文件操作学习笔记

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C】文件操作学习笔记

  • 打开文件 fopen();
  • 关闭文件 fclose();
  • 从文件中读取一个字符 fgetc();
  • 从文件中写入一个字符 fputc();
  • 从文件中读取一行 fgets();
  • 向文件中写入一行 fputs();
  • 检查文件是否结束 feof();
  •  fwrite()
  •  fread()
字符串说明
r(只读)以只读的方式打开文件,文件必须存在,不然会报错
r+(读写)以读/写方式打开文件,该文件必须存在,不然会报错,(注:打开文件只进行读操作时不会清空文件原始数据,进行写入时会覆盖文件原始数据,重新写入数据)
rb(只读)为了读打开一个二进制文件,文件不存在将会报错(注:当使用rb打开文件进行写入的时候,由于是只读属性,所以写入不了,程序不会报错)
rb+(读写)为读和写打开一个二进制文件,文件不存在将会报错
w(只写)为了写入打开一个文本文件,当文件不存在的时候将会创建新文件(注:文本文件中存在数据时将会清空)
w+(读写)

为读和写打开一个文本文件,当文件不存在的时候将会创建新文件

(注:打开文本文件里面存在数据时将会清空)

wb(只写)为了写入打开一个二进制文件,当文件不存在的时候将会创建文件
wb+(读写)为了读和写打开一个二进制文件,当文件不存在的时候将会创建
a(追加)以写模式打开文件,在文件末尾添加内容,文件不存在将会创建
a+(追加)在现有文件末尾添加内容,如果文件不存在则创建一个新文件,可以读整个文件,但是只能从末尾添加内容
ab(追加)以写模式打开二进制文件,在文件末尾添加内容,文件不存在将会创建
ab+(追加)以读写模式打开二进制文件,在文件末尾添加内容,文件不存在将会创建

函数说明
getc

int getc(FILE *stream),从文件流中读取字符,读到文件尾返回EOF

(注:getc与fetc作用相同,但在某些库中getc为宏定义)

putcint putc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
getschar * gets(char *_Buffer),从标准输入读取字符串,但是次函数存在一个严重的缺陷,不会检查数组能不能装下,见代码片1
puts

int puts(const char *s),将字符串输出到终端,输出遇到’‘也就是字符串的标志符才会停止,显示字符串时会自动在其后添加换行符

fgetcint fgetc(FILE *file);从文件中读取一个字符
fputcint fputc(int ch,FILE *file); 向文件中写入一个字符
fgetschar *fgets(char *Buf,int MaxCount,FILE *file),从文件中读取MaxCount-1个字符,第MaxCount字符将会填充’‘,。如果fgets()在读到字符上限之前已读完一整行,它会把表示行结尾的换行符放在空字符前面。fgets()函数在遇到EOF时将返回NULL值,可以利用这一机制检查是否到达文件结尾;如果未遇到EOF则返回之前传给它的第一个参数地址。
fputsint fputs(const char * Str,FILE *file);向指定文件中写入一个字符串,写入失败返回-1,与puts函数不同的是,fputs在打印字符串时候不会在其末尾添加换行符
//代码片1

int main(int argc,char *argv[])
{
    char buf[5];
    gets(buf);
    printf("%s",buf);
    return 0;
}

//输入affection
//将会输出affection,但是实际buf的长度为5,导致gets访问未被分配的内存
//如果程序其他部分使用这个内存,则程序将会报错
一、fseek函数
int fseek(FILE * File, long Offset, int Origin);

第二个参数是偏移量

第三个参数是模式,模式有以下几种

  • SEEK_SET 文件开始处
  • SEEK_CUR 当前位置
  • SEEK_END 文件末尾
eg.
fseek(fp,0,SEEK_SET);                //定位至文件开始处
fseek(fp,10,SEEK_SET);               //定位至文件的第10个字节
fseek(fp,2,SEEK_CUR);                //定位至当前位置往后2个字节
fseek(fp,0,SEEK_END);                //定位至文件末尾
fseek(fp,-10,SEEK_END);              //定位至文件末尾往前10个字节
二、ftell函数
long ftell(FILE * _File);

它返回的是参数指向文件的当前位置距文件开始处的字节数。

三、fscanf函数
int fscanf(FILE * stream,const char *format,[arugment...]);

在文件操作中的妙用:

比如有一个文件records.txt,文本内容为
学号  姓名   成绩
S001  Judy   80
S002  Cindy  78
S003  Helens  90

如果要将文本中的内容分割出来用数组保存就可以用fscanf这个函数

int main()
{
    char id[10];
	char name[10];
	char score[10];
	FILE * fp = fopen("F:\records.txt", "r");
	if (fp == NULL)
	{
		perror("Open Fail");
	}
	else
	{
		fscanf(fp, "%s%s%s", id, name, score);
		printf("id  = %sn", id);
		printf("name = %sn", name);
		printf("score = %sn", score);
		fclose(fp);
	}
    return 0;
}


//输出为
id  = S001
name = Judy
score = 80

其中要注意的是id,name,score数组能够存储得下文本中的值,比如说当名字超过10个字符时,由于name表示的是首地址,可能在运行的时候不会报错,但是实际已经发生数组越界,当程序的其他部分使用越界部分的内存时,程序将会报错

四、fprintf函数
int fprintf(FILE *fp,const char *format,[argument]);
//往文本中写入
S004 Dina 96

int main()
{
	char id[10] = "S004";
	char name[10] = "Dina";
	char score[10] = "96";
	FILE * fp = fopen("F:\records.txt", "a+");
	if (fp == NULL)
	{
		perror("Open Fail");
	}
	else
	{
		fprintf(fp, "n%s %s %s", id, name, score);
		printf("id  = %sn", id);
		printf("name = %sn", name);
		printf("score = %sn", score);
		fclose(fp);
	}
	return 0;
}

//文件中的内容变成了
S001  Judy   80
S002  Cindy  78
S003  Helens  90
S004 Dina 96

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664154.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号