C初级_文件操作

0. 写在前面

  1. .文件操作中的函数要注意是对文件进行操作,而不是对输出屏幕进行操作(在对文件进行操作前,要先打开函数-fopen)
  2. 对文件进行写入时有以下函数(fputc fputs fwrite fprintf)
  3. 对文件进行读取时有以下函数(fgetc fgets fread fscanf)
  4. 对文件操作完成后,要关闭文件-fclose
  5. 另外文件指针默认是指向文件开头,而要对文件部分进行操作时
    涉及到
    ftell(返回指针位置)函数、
    fseek(移动指针)函数、
    feof(判断文件执行情况)函数
    frewind(将指针移回文件开头)函数
    fmove(删除文件)函数
  6. 进行一次文件操作的格式代码:
  FILE* fp;       //定义一个文件指针
  fp=fopen("文件位置","文件打开方式");  //用文件指针打开文件
  if (fp == NULL)      //判断文件是否存在
  {
   	printf("文件打开失败");
   	return;       //return 会直接结束函数
  }
  //...文件具体操作(读取 or 写入)
  fclose(fp);       //文件操作完成,关闭文件

2. 文件指针和文件操作函数说明

FILE* fp;//先定义文件指针

2.1.打开和关闭文件 fopen fclose

fopen格式:

  • fopen(“文件路径”,“文件打开方式”);

fclose格式:

  • fclose(文件指针名);

(每次文件打开之后需要关闭文件)

2.2 文件读写函数
2.2.1 文本文件

fgetc fputc 每次单独的读取一个字符的内容

   ch = fgetc(fp);//读取文件中的一个字符
   putchar(ch);//将读取到的字符输出到屏幕
   char str[128];
   fgets(str, 128, fp1);//读取一行,不超过128个字符,文件指针 fgets 需要与字符数组搭配使用输出fgetc、fgets的内容需要putchar、puts函数
   fputc函数的写入方式:
   char str[128] = "hello world";
   for (int i = 0; str[i] != '\0'; ++i)
   {
    	fputc(str[i], fp);
   }

fgets fputs 以字符串的方式进行读写

   char str[128];
   fgets(str, 128, fp1);//读取一行,不超过128个字符,文件指针 fgets 需要与字符数组搭配使用
   puts(str);//puts 会在末尾自动加\n
   //方式1.读取全部文件内容的
   while (fgets(str, 128, fp1) != NULL)//注意是一行不超过128,而不是所有内部不超过128
   {
    	puts(str);
   }
   //方式2.读取全部文件内容
   while (1)
   {
    	fgets(str, 128, fp1);
    	puts(str);
    if (feof(fp))break;//feof表示文件末尾的值,是1表示已经读到文件末尾,是0表示文件还未读取完成
   }
   fclose(fp1);
   char str1[128] = "刘你要加油";
   fputs(str1, fp1);//将一串字符写入到文件当中

fscanf fprintf 格式化读取

   //fscanf-获取文件内内容
   fscanf(fp3, "%d\t%s\n", &st.ID, st.name);
   //fprintf-将内容写到文件中
   //格式:fprintf(fp,"格式占位符",数据);
   STU arr[4] = { 1,"张三",2,"李四",3,"王五",4,"赵六" };
   for (int i = 0; i < 4; ++i)
   {
    	fprintf(fp2, "%d\t%s\n", arr[i].ID, arr[i].name);
   }
2.2.2 二进制文件读写

fread fwrite(二进制文件的读写方式)

   //fread函数的用法-读取内容
   STU st;
   while (fread(&st, sizeof(STU), 1, fp)!=0)
   {
    	printf("%d\t%s\n", st.ID, st.name);
   }
   //fwrite函数的用法-写入内容
   //将一个结构体看成一个整体
   fwrite(arr, sizeof(STU), 4, fp3);//第一个地址 第二个单个整体的大小 第三个“整体“的个数第四个文件指针

一般文件的读写不会同时进行、比如:游戏开始之前进行读档 游戏结束的时候存档写入文件

3. 文件打开方式参数2说明

r—— read —— 读取—— 从文件中读取数据 如果文件不存在 则打开失败
w—— write—— 写入—— 清空文件然后写入 如果文件不存在则创建一个新文件
a—— append ——追加 ——在原文件后面增加新内容 文件不存在 则创建新文件
b —— 表示二进制文件
t—— 表示文本文件
rb —— 用读取的方式打开一个二进制文件,如果文件不存在就会打开失败
rt—— 用读取的方式打开一个文本文件(t可以省略)
‘“+ —— 如果后面加一个+ 表示文件可读写
rb+ —— 用读取的方式打开一个二进制文件 文件可以读写
(类似的可以写成 ab+ wb+)

4 说明

  • 文件操作:将程序的数据(内存中)存在盘符里的过程、及将盘符的内存读取到内存的过程

  • 文件操作主要包括:读档和存档

  • 文件的路径,一般写相对路径

  • 二进制文件:用计算机方式存放的文件,比如mp3 wav

  • 二进制文件文件的后缀可以是任何格式

  • (二进制文件用记事本打开的时候会乱码)

  • 文本文件就是用文本文件打开不会乱码的文件

  • (似乎将所有的文件分成了二进制文件和文本文件)

  • f–> function 函数的意思

4.1 新版函数
  • fopen–>fopen_s
  • fopen_s(&fp,文件路径,文件打开方式)
  • fopen(文件路径,文件打开方式)
  • 文件的读取过程中要注意文件内应具有一定的规律
  • scanf和fscanf两个函数在读取字符串的时候中间不能有空格
4.2 文本文件和二进制文件的区别
  • 文本文件不会乱码,但是保密性不强
  • 二进制文件会乱码但是保密性强
  • 二进制文件计算机在读取的时候更快,适合编程使用

5. 完整代码

#include<stdio.h>
//预制结构体
typedef struct student //结构体类型
{
	int ID;
 	char name[100];
 ///....
}STU;
//预制联合
union MyUnion
{
 	int x;
 	float y;
};
//预制枚举
enum dir
{
 	UP, DOWN, LEET, RIGH//常量 有名字可以提高代码可读性
};
//结构体-联合-枚举练习
void test()
{
 	student liu;
 	liu.ID;
 	STU beiwang;
 	beiwang.ID;//.运算符
 	STU *p = &beiwang;
 	p->ID;// ->箭头运算符
 	union MyUnion beibei;
 	beibei.x = 3;
 	beibei.y = 4.0f;//给一个成员赋值,其它成员的值就会失效
}
void readFile()
{
 	FILE* fp;
 	fp = fopen("123.txt","r"); 
 	if (fp == NULL)
 	{
  		printf("文件打开失败");
  		return;//return 会直接结束函数
 	}
 	char ch;
 	//ch = fgetc(fp);//读取文件中的一个字符
 	//putchar(ch);//将读取到的字符输出到屏幕
 	//读入,并输出多个字符  
 	while (1)//
 	{
  		ch = fgetc(fp);
  		if (ch == EOF) break;//读到文件末尾表示结束读取 EOF=end of file
  		putchar(ch);
 	}
 	fclose(fp);
 	FILE* fp1;
 	fp1 = fopen("1234.txt", "r");
 	if (fp1 == NULL)
 	{
  		printf("文件打开失败");
  		return;//return 会直接结束函数
 	}
 	char str[128];
 	fgets(str, 128, fp1);//读取一行,不超过128个字符,文件指针 fgets 需要与字符数组搭配使用
 	puts(str);//puts 会在末尾自动加\n
 	//方式1.读取全部文件内容的
 	while (fgets(str, 128, fp1) != NULL)//注意是一行不超过128,而不是所有内部不超过128
 	{
  		puts(str);
 	}
 //方式2.读取全部文件内容
 	while (1)
 	{
  	fgets(str, 128, fp1);
  	puts(str);
  	if (feof(fp))break;//feof表示文件末尾的值,是1表示已经读到文件末尾,是0表示文件还未读取完成  
 	}
 	fclose(fp1);
}
void writeFile()
{
 	FILE* fp;
 	fp = fopen("写入.txt","w");
 	if (fp == NULL)
 	{
  	printf("文件打开失败");
  	return;//return 会直接结束函数
 	}
 	char str[128] = "hello world";
 	for (int i = 0; str[i] != '\0'; ++i)
 	{
  		fputc(str[i], fp);
 	}
 	fclose(fp);
 	FILE* fp1;
 	FILE* fp2;
 	fp1 = fopen("写入1.txt","w");
 	if (fp1 == NULL)
 	{
  		printf("文件打开失败");
  		return;//return 会直接结束函数
 	}
 	char str1[128] = "刘你要加油";
 	fputs(str1, fp1);//将一串字符写入到文件当中 
 	fclose(fp1);
 	fp2 = fopen("写入3.txt", "w");
 	if (fp2 == NULL)
 	{
  	printf("文件打开失败");
  	return;//return 会直接结束函数
 	}
 	STU arr[4] = { 1,"张三",2,"李四",3,"王五",4,"赵六" };
 	for (int i = 0; i < 4; ++i)
 	{
  	fprintf(fp2, "%d\t%s\n", arr[i].ID, arr[i].name);
 	}
 	fclose(fp2);
}
void read()
{
 	FILE* fp;
 	fp = fopen("file.liu", "rb");//由于是二进制文件,所以文件的后缀可以是任何格式
 	if (fp == NULL)
 	{
  		printf("文件打开失败");
  		return;//return 会直接结束函数
 	}
 	STU st;
 	while (fread(&st, sizeof(STU), 1, fp)!=0)
 	{
  		printf("%d\t%s\n", st.ID, st.name);
 	}
 	fclose(fp);
}
void write()
{
 	FILE* fp3;
 	fp3 = fopen("file.liu", "wb");
 	if (fp3 == NULL)
 	{
  		printf("文件打开失败");
  		return;//return 会直接结束函数
 	}
 	STU arr[4] = { 1,"张三",2,"李四",3,"王五",4,"赵六" };
 	//将一个结构体看成一个整体
 	fwrite(arr, sizeof(STU), 4, fp3);//第一个地址 第二个单个整体的大小 第三个“整体“的个数第四个文件指针
 	fclose(fp3);
}
void show()
{
 	FILE* fp3;
 	fp3 = fopen("写入3.txt", "r");
 	if (fp3 == NULL)
 	{
  	printf("文件打开失败");
  	return;
 	}
 	STU st;
 	while (EOF != fscanf(fp3, "%d\t%s\n", &st.ID, st.name))
 	{
 	 	printf("%d\t%s\n",st.ID,st.name);
 	}
 	fclose(fp3);
}
int main()
{
 	readFile();
 	writeFile();
 	show();
 	write();
 	read();
 	getchar();
 	return 0;
}
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值