【C】文件 *** 作学习笔记

【C】文件 *** 作学习笔记,第1张

【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),从标准输入读取字符串,但是次函数存在一个严重的缺陷,不会检查数组能不能装下,见代码片1puts

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5666104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存