C语言文件 *** 作

C语言文件 *** 作,第1张

C语言文件 *** 作 文件基础

文件 *** 作: 针对磁盘的文件做一个读写 *** 作

  • 标准输入: stdin —>键盘输入
  • 标准输出: stdout—>控制台
  • 自定义文件: FILE* fp
    • 文本文件
    • 二进制文件
文本文件
  • 1.文件打开
//函数原型
FILE* fopen(const char* fileName,const char* mode);
//filename: 文件路径
//mode: 读写方式
/************************************************************
*		w:  只写的方式(write) 创建一个文件进行写入,原文件存在就清空原文件
*		r:  只读的方式(read)  
*		a:  追加模式(append) 
*			1.如果存在原文件,就在不清空原文件写 *** 作的情况下,在原文件末位接着写  
*	 		2.如果不存在原文件,创建一个新文件进行写入
*	
*		+: 代表可读可写
*		w+ r+ a+
*		b: 二进制的方式
* 		wb ab rb wb+ ab+ rb+ 
*************************************************************/
//注意点: C语言打开文件不具备创建文件夹的功能

  • 2.文件关闭
    • 如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF
//函数原型
int fclose(FILE* file)
  • 3.文件结束标记: EOF
#include 
int main() 
{
	FILE* fp=NULL;
	fp = fopen("write.txt", "w");
	if (fp == NULL) 
	{
		printf("文件打开失败!\n");
		return 0;
	}
	fclose(fp);
	
	fp = fopen("append.txt", "a");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
		return 0;
	}
	fclose(fp);
	
	fp = fopen("read.txt", "r");
	printf("%d\n", EOF);
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
		return 0;
	}
	fclose(fp);
	return 0;
}
文件读写

注意点:所有文件 *** 作底层都做了文件指针移动,一般不需要大家手动做文件指针移动(fp++错误)

  • 以字符和字符串的方式读写

    • 字符的方式
//fgetc(): 读 *** 作
//fputc(): 写 *** 作
int  fgetc(FILE* _Stream);
//返回值: 读写的字符
//参数: 文件指针,读的是那个文件
int  fputc(int   _Character,FILE* _Stream);
//打印的字符是什么:_Character
//打印到哪里: 文件指针指向的文件
  • 字符串的方式
//fgets();
//fputs(); 
int  fputs( char const* _Buffer,FILE* _Stream);
//_Buffer写内容
//_Stream哪个文件
char*  fgets(char* _Buffer,int   _MaxCount,FILE* _Stream);
//读的内容存到那里: _Buffer
//容器大小:   _MaxCount
//从那里开始读的:   _Stream
  • 格式化读写

    格式化读写(表格数据读写)不适用于文件指针移动

int fprintf(FILE* fp,const char* mode,...);
//fp: 打印到文件指针指向文件
//mode: 格式控制字符
//...: 参数名表,多个变量
int fscanf(FILE* fp,const char* mode,...);
//fp: 读的哪个文件
//mode: 按什么格式读
//...: 参数地址表(多个变量的地址)
//注意点: 
//1.怎么写怎么读就行了
//2.读 *** 作不支持精度控制
//结构数据的读写
#include 
#include 
struct MM 
{
	char name[20];
	int age;
	int num;
};
void writeFile(struct MM array[], int arrayNum, const char* fileName)
{
	FILE* fp = fopen(fileName, "w");
	assert(fp);
	for (int i = 0; i < arrayNum; i++) 
	{
		fprintf(fp, "%s\t%d\t%d\n", array[i].name, array[i].age, array[i].num);
	}
	fclose(fp);
}
void readFile(const char* fileName) 
{
	FILE* fp = fopen(fileName, "r");
	assert(fp);
	struct MM temp[3];
	int i = 0;
	while (fscanf(fp, "%s\t%d\t%d\n", temp[i].name, &temp[i].age, &temp[i].num) != EOF) 
	{
		fprintf(stdout, "%s\t%d\t%d\n", temp[i].name, temp[i].age, temp[i].num);
		//printf("%s\t%d\t%d\n", temp[i].name, temp[i].age, temp[i].num);
		i++;
	}
	fclose(fp);
}
int main() 
{
	struct MM mm[3] =
	{
		{"iron",18,1001},
		{"Close",16,1002},
		{"8K龙",19,1003}
	};
	writeFile(mm, 3, "fprintf.txt");
	//readFile("fprintf.txt");
	FILE* fp = fopen("fprintf.txt", "r");
	assert(fp);
	struct MM temp[3];
	int i = 0;
	while (fscanf(fp, "%s\t%d\t%d\n", temp[i].name, &temp[i].age, &temp[i].num) != EOF)
	{
		fprintf(stdout, "%s\t%d\t%d\n", temp[i].name, temp[i].age, temp[i].num);
		//printf("%s\t%d\t%d\n", temp[i].name, temp[i].age, temp[i].num);
		i++;
	}
	fclose(fp);
	//int a=1;
	//fscanf(stdin,"%d",&a);	//等效scanf函数

	return 0;
}
  • 二进制的方式读写
 size_t  fread( void*  buff,size_t size,size_t count,FILE*  _Stream);
 //读的内容存到那里: buff
 //每一次读多少字节: size
 //总共读几次: count
 //读的哪个文件:_Stream
 //注意点: 堆区内存,只能读到char* 内存中
 size_t  fwrite( void*  buff,size_t size,size_t count,FILE*  _Stream);
 //写的内容: buff
 //每一次写多少字节: size
 //总共写多少次: count
 //写的哪个文件:_Stream

一般用来读结构数据,注意点: 如果写到文件中是乱码大家不要介意,能成功读出来即可

文件指针
void rewind(FILE* file);		//把文件指针移动当前文件开头
int  fseek(FILE* _Stream,long  _Offset, int   _Origin);  //文件定位
//文件指针:_Stream
//相对位置偏移量:_Offset  整数:右边  负数: 左边

//参照点:_Origin
//SEEK_CUR   当位置
//SEEK_END   结束位置
//SEEK_SET   开始位置

int ftell(FILE* file);			//文件指针移动
int feof(FILE* file);			//文件是否到达文件末位
文件重定向
FILE*  freopen(char const* _FileName,char const* _Mode,FILE*  _Stream);

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

原文地址: https://outofmemory.cn/langs/674876.html

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

发表评论

登录后才能评论

评论列表(0条)

保存