C语言文件

1.文件的打开与关闭

(1)文件指针FILE(本质是一个结构体)

//<stdio.h>中的定义
typedef struct _iobuf
{
    void* _Placeholder;
} FILE;

 (2)打开关闭

FILE* fopen(const char* filename, const char* mode);

int main()
{
	FILE* pf = fopen("test.txt", "w");  //用FILE*的结构体指针变量接收
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	fclose(pf);  
	pf = NULL;         //关闭文件后制空pf指针
	return 0;
}

2.文件相关函数

(1)写入文件

int fputc(int ascii, FILE* stream);     //写入字符
int fputs(const char* string, FILE* stream);       //写入一行
int fprintf(FILE* stream, const char* format[, argument]...);    //往文件里格式化写入
//写文件时,若文档里有内容,则会清空后写入
size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream);  //二进制写入
//要写的数据来源的地址,一个元素多大,元素个数,目标地址,返回成功写入的数据个数

 (2)从文件中读取

int fgetc(FILE* stream);      //读字符
char* fgets(char* string, int n, FILE* stream);    
//读一行,n为最大读取个数,但是实际上会读取少一个,因为最后一个要补'\0'
int fscanf(FILE* stream, const char* format[, argument]...);    //从文件里格式化读取

size_t fread(void* ptr, size_t size, size_t count, FILE* stream);  //二进制读取
//返回成功读取的数据个数

 

 (3)例子

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		perror("fopen"); //也能打印错误信息,而且会在错误信息之前加上“fopen:”
		return 1;
	}
	fputc('a', pf);
	fputc(97, pf);
	
    //读文件
	int ch = 0;   
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c\n", ch);
	}

	char arr[20];
	fgets(arr, 5, pf);
	printf("%s\n", arr);   //读完了之后存到arr里去了,并不是直接读取到屏幕上

	int a;
	char b;
	fprintf(pf,"%d %c", a, b);    //写入
	fscanf(pf, "%d %c", &a, &b);   //读出
	
	fclose(pf);
	pf = NULL;
	return 0;
}

3.流 

任何一个c程序,只要运行起来,就会默认打开3个流
FILE* stdin - 标准输入流(键盘) 
FILE* stdout - 标准输出流(屏幕)
FILE* stderr - 标准错误流(屏幕)
fprintf(pf, "%d %c", a, b);    //往文件里格式化写入
fprintf(stdout, "%d %c", a, b);   //往屏幕里格式化写入,就写道屏幕上了(输出了)

4.sprintf()和sscanf

int sprintf(char* str, const char* format[, argument] ...);
//把一个格式化的数据写到字符串中,本质是把一个格式化的数据转化成字符串

int sscanf(char* str, const char* format[, argument] ...);
//从字符串中提取格式化数据

struct s
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct s s = { "zhangsan",20,55.5f };
	char buf[100];
	sprintf(buf, "%s %d %f", s.arr, s.age, s.score);
	printf("%s\n", buf);
	//把一些格式化的数据写到字符串buf中,变成字符串了“zhangsan 20 55.500000”

	struct s su = { 0 };
	sscanf(buf,"%s %d %f", su.arr,&(su.age), &(su.score));
	//从字符串buf中获取一个格式化的数据到su中
	printf("%s %d %f", su.arr,su.age,su.score);
	
	return 0;
}

5.文件随机函数

(1)fseek()——控制文件指针

int fseek(FILE* stream, long int offset, int origin); 
//流,偏移量,起始地址(SEEK_SET,SEEK_CUR,SEEK_END)

(2)ftell()——寻找文件指针

long ftell(FILE* stream);   
//返回指针相对起始位置的偏移量

(3)rewind()——文件指针返回起始位置

void rewind(FILE* stream);
int main()
{
	FILE* pf = fopen("test.txt", "r");

	fseek(pf,2, SEEK_SET);   //定位文件指针
	int ch = fgetc(pf);    //读取并存放
	printf("%c\n", ch);    //打印ch

	fseek(pf, 2, SEEK_CUR);
	fseek(pf, -1, SEEK_END);

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对玛导至昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值