c语言 文件部分学习小结


前言

提示:本文是一篇学习总结,学习的b站小甲鱼的视频,相当于是一种复习吧,文中许多内容都是网课里面的内容,并且是自己的一次写东西的尝试,希望自己可以坚持下去。


提示:以下是本篇文章正文内容,下面案例可供参考

一、文件的概念

1.文件是指一组相关数据的有序集合

通常驻留在外部介质(如磁盘)上
在这里插入图片描述

2.文件分类:

1.从用户角度

特殊文件(标准输入输出文件或标准设备文件)
普通文件(磁盘文件)

2.从操作系统角度看

每一个与主机相连的输入、输出设备都可以看做文件 (键盘、显示器)

3.按数据的组织形式

ASCII文件(文本文件)
二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。
在这里插入图片描述
文本文件便于对字符逐个处理,也便于输出字符。但一般占存储空间较多,且要花费转换时间。
二进制文件节省空间、时间但不是一个字节对应一个字符 ,不能直接输出字符形式。
(两种文件特点相反)

3.(非)缓冲文件系统

在这里插入图片描述
一个文件在内存中只有一个缓冲区,向文件输入数据就作为输出缓冲区,从文件输入数据就作为输入缓冲区。
在这里插入图片描述

二、文件常用的函数

1.文件的打开与关闭

文件型指针变量
格式:FILE fp;
/
*
FILE是个结构体
在这里插入图片描述
*/
fp=fopen(文件名,使用文件方式);
在这里插入图片描述
“r”:是只读,所以要用这种方式打开文件,该文件必须存在。
“w”:只写不需要存在,没有就创建一个。但是无论是否存在,都会刷新里面的内容。
“a”:所以要是不想刷新文件的内容可以使用追加,但该文件必须存在。

fclose(文件指针);
关闭成功返回0;否则返回EOF(-1)

2.文件的读写

1.字符读写函数 fgetc和fputc

调用: fputc(ch,fp);
功能:将字符ch输入到fp所指的文件中去
说明:
注意fopen的打开方式。
每写入一个字符,文件内部位置指针向后移动一个字节。
成功写入返回写入字符,否则返回EOF

示例如下(示例):

#include<stdio.h>
#include<stdlib.h>
int main() {
	char ch, FileName[20];
	FILE* fp;
	printf("please put filename you want to write: ");
	scanf("%c", FileName);
	if (!(fp = fopen(FileName, "wt+"))) {
		printf("no open	\n");
		exit(0);  //终止程序
	}
		printf("please input the sentences you want to write: ");
		ch = getchar();  //[^1]接收文件名输入时的回车 否则输入的文本文件最开始有个回车
		ch = getchar();
		while (ch!=EOF)   // EOF 为ASCII编码的结束标志 输入:ctrl+z
		{
			fputc(ch, fp);
			ch = getchar();
		}
		fclose(fp);
		return 0;
}

在这里插入图片描述
在这里插入图片描述


调用:fgetc(ch,fp);
功能:从fp所指的文件中读取一个字符送入ch中。
注意:
在这里插入图片描述
补充:
在这里插入图片描述
二进制文件不能用EOF只能用feof()函数
在这里插入图片描述

2.字符串读写函数 fgets和fputs

调用:fgets(buffer,n,fp);
功能:从fp所指的文件中读取n-1个字符送入字符数组buffer中,因为在最后加一个‘\0’。
返回值: buffer首地址
调用:fputs(“字符串”,fp);
功能:将字符串写入fp所指的文件中。
返回值:成功返回0;否则返回EOF

补充:
从键盘输入字符串是,用scanf(”%s“,buffer)遇到“空格“就会结束
用fgets(buffer,n,stdin);就可以输入带空格的语句 stdin文件作为键盘输入的缓冲区。

3.数据块读写函数 fread和fwrite

调用:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
参数说明:
buffer:是一个指针。
对fread是输入数据的存放地址;对fwrite是输出数据的地址(均指起始地址)
size:指要读写的字节数。
count:size的个数。
fp:文件型指针。
例子:
struct student
{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];
fwrite(&stu[i], sizeof(student), 1, fp);
fread(&stu[i], sizeof(student), 1, fp) ;

4.格式化读写函数 fscanf和fprintf

调用:
fprintf(文件指针,格式字符串,输出列表);
fscanf(文件指针,格式字符串,输出列表);
例如:
fprintf(fp,"%d,%6.2f",i,t);
fscanf(fp,"%d,%f",&i,&t);

3.fseek和rewind、ftell函数

调用:fseek(文件类型指针,位移量,起始点);
功能:改变文件位置指针
参数:
起始点
在这里插入图片描述
例子:
在这里插入图片描述
rewind(fp);
将文件内部指针指向文件头

ftell函数
在这里插入图片描述

4.出错的检测

ferror函数
在这里插入图片描述
cleareer函数
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#define SIZE 4
struct student
{
	char name[10];
	int num;
	int age;
	char addr[15];
}stu[SIZE];
void save() {
	FILE* fp;
	int i;
	if (!(fp=fopen("studentlist","wb")))
	{
		printf("no open /n");
		return;
	}
	for ( i = 0; i < SIZE; i++)
	{
		if (fwrite(&stu[i], sizeof(student), 1, fp) != 1) {
			printf("write error\n");
			fclose(fp);
		}
	}
}
void load() {
	FILE* fp;
	int i;
	if (!(fp = fopen("studentlist", "rb+")))
	{
		printf("no open /n");
		return;
	}
	for (i = 0; i < SIZE; i++)
	{
		if (fread(&stu[i], sizeof(student), 1, fp) != 1) {
			printf("read error\n");
			fclose(fp);
		}
	}
	for (i = 0; i < SIZE; i++)
	{
		printf("%10s %5d %5d %10s", &stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr);
	}
}
int main() {
	int i=1;
	printf("please input student information: \n");
	for ( i = 0; i < SIZE; i++)
	{
		scanf("%s,%d,%d,%s", &stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr);
	}
	save();
	fwrite(&stu[1], sizeof(student), 1, stdout); //与stdin对应 功能是输出到电脑屏幕
	/*load();
	FILE* fp;
	if (!(fp = fopen("studentlist", "r")))
	{
		printf("no open /n");
		exit(0);
	}
	rewind(fp);
	fseek(fp, i * sizeof(student), 0);
	student one;
	fread(&one, sizeof(student), 1, fp);
	printf("%s %d %d %s", &one.name, &one.num, &one.age, &one.addr);*/
	return 0;
}

该处使用的url网络请求的数据。


总结

用的很多图片都是直接从网课里截的,第二部分代码目的是体现一些函数的应用。没有语法错误,跟小甲鱼编的也没多少出入。但在我电脑上fread那些函数效果就跟老师有点出入。目前以我的能力还没能解决这些问题 也许这件事会有后续。如果有大佬看到也请指出我的问题 下面是老师总结的一些函数 希望本文对你我都有帮助。

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值