C语言---文件操作

数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。

⽂件在读写之前首先要打开⽂件,在使⽤结束之后应该关闭⽂件。

fopen 函数来打开⽂件, fclose 函数来关闭⽂件。

用法如下:

FILE * fopen ( const char * filename, const char * mode );//const char * filename打开的文件名。//const char * mode以读或写的方式打开文件

int fclose ( FILE * stream );//关闭文件

文件打开模式
“r”(只读)为了输⼊数据(文件里面的数据向外输出),打开⼀个已经存在的⽂本⽂件。如果文件不存在,结果会报错。
“w”(只写)为了输出数据(向文件里写数据),打开⼀个⽂本⽂件。如果文件不存在,建立一个新文件。
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件。如果文件不存在,结果会报错。
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件。如果文件不存在,建立一个新文件。

例如:

int main()
{
	FILE* pf = fopen("text.txt", "w");//以写的形式打开一个text.txt文件
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件

	fclose(pf);关闭文件
	pf = NULL;//将文件置空
	return 0;
}

顺序读写函数如下:

我对输入输出的理解是计算机相当于人的大脑,向大脑里输送文件就是输入。从大脑里向外输送就是输出。

fgetc字符输⼊函数(文件里面的数据向外读)
fputc字符输出函数(向文件里写数据)
fgets⽂本⾏输⼊函数
fputs⽂本⾏输出函数
fscanf格式化输⼊函数
fprintf格式化输出函数
fread⼆进制输⼊
fwrite⼆进制输出

fgetc和fputc函数:

int main()
{
  FILE* pf = fopen("text.txt", "w");//以写的形式打开文件
	if (pf == NULL)
	{
			perror("fopen");
			return 1;
	}
	char ch = 0;
	for (ch = 'a'; ch <= 'z'; ch++)//写内容
	{
		fputc(ch, pf);
	}
	fclose(pf);//关闭文件
	pf = NULL;
	return 0;
}


int main()
{
	FILE* pf = fopen("text.txt", "r");//已读的形式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)//读文件中的字符
	{
		printf("%c\n", ch);//打印到屏幕上
	}
	fclose(pf);//关闭文件
	pf = NULL;
	return 0;
}

fputs和fgets函数:

int main()
{
	FILE* pf = fopen("test.txt", "w");//以写的形式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("hello world\n", pf);//写文件,换行会自己添加\n
	fputs("hello china", pf);

	fclose(pf);//关闭文件
	pf = NULL;
	return 0;
}
int main()
{
	FILE* pf = fopen("test.txt", "r");//以读的形式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	
	//fgets(arr, 10, pf);//读文件时实际上读10-1个数据
	
	char arr[20] = { 0 };//读文件
	while (fgets(arr, 20, pf) != NULL)
	{
		printf("%s", arr);//默认有\n,所以不需要加\n
	}

	fclose(pf);//关闭文件
	pf = NULL;
	return 0;
}

fscanf和fprintf函数:

struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { "张三",20,65.5f };
	FILE* ptr = fopen("test.txt", "w");//以写的形式打开文件
	if (ptr == NULL)
	{
		perror("fopen");
		return 1;
	}
	fprintf(ptr, "%s %d %f", s.name, s.age, s.score);//fprintf是向文件中写数据
	fclose(ptr);//关闭文件
	ptr = NULL;
	return 0;
}
int main()
{
	struct S s = { 0 };
	FILE* ptr = fopen("test.txt", "r");//以读的形式打开文件
	if (ptr == NULL)
	{
		perror("fopen");
		return 1;
	}
	fscanf(ptr, "%s %d %f", s.name, &(s.age), &(s.score));//fscanf从文件中读取数据放在s中
	printf("%s %d %f", s.name, s.age, s.score);//读取的内容打印在屏幕上

	fclose(ptr);//关闭文件
	ptr = NULL;
	return 0;
}

fread和fwrite函数:

 int main()
{
	int arr[] = { 1,2,3,4,5,6 };
	FILE* pf = fopen("test.txt", "wb");//以二进制写的形式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int sz = sizeof(arr) / sizeof(arr[0]);
	fwrite(arr,sizeof(arr[0]),sz,pf);//以二进制形式写。
	//size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );fwrite用法中const void * ptr是要放的数据,size_t size是元素大小。
	//size_t count是放多少个数据,FILE * stream是放到那个文件
	fclose(pf);
	pf = NULL;
	return 0;
}
int main()
{
	int arr[5] = { 0};
	FILE* pf = fopen("test.txt", "rb");//以二进制形式读。
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fread(arr, sizeof(arr[0]), 5, pf);//以二进制形式读,用法和fwrite一样。
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

⽂件读取结束的判定

//feof的作⽤:当⽂件读取结束的时候,判断是否遇到⽂件尾结束
//ferror:读取的时候发生错误
//fgetc 如果读取正常,返回的是读取到字符的ASCLL码值。读取过程中遇到文件末尾或者发生错误返回EOF
//fgets 如果读取正常,返回的是存储读取到的字符串的字符数组的地址。读取过程中遇到文件末尾或者发生错误返回NULL
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int ch = 0;
	while ((ch = getc(pf)) != EOF)
	{
		printf("%c\n", ch);
	}
	if (feof(pf))
		printf("遇到文件末尾,读取正常结束\n");
	else if (ferror(pf))
		perror("fgetc");
	fclose(pf);
	pf = NULL;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值