C语言--day25

fwrite
cs 复制代码
#include <stdio.h>
struct stu
{
	int id;
	char name[32];
	int score;
};
int main(int argc, const char *argv[])
{
	FILE *fp = fopen("1.txt", "w");
	if (NULL == fp)
	{
		printf("fopen error\n");
		return -1;
	}
	
	struct stu s = {1, "zhangsan", 99};
	
	struct stu ss[] = {{2, "lisi", 79}, {3, "wanger", 90},
						{4, "zhaowu", 88}};

	size_t size = fwrite(&s, sizeof(struct stu), 1, fp);
	printf("size = %ld\n", size);
	
	size = fwrite(ss, sizeof(struct stu), 3, fp);
	printf("size = %ld\n", size);

	fclose(fp);
	return 0;
}
fread
cs 复制代码
#include <stdio.h>


int main(int argc, const char *argv[])
{
	FILE *fp = fopen("stdio.h", "r");
	if (NULL == fp)
	{
		printf("fopen error\n");
		return -1;
	}
	char buff[512] = {0};

	size_t size = fread(buff, 1, sizeof(buff)-1, fp);
	printf("size = %ld\n", size);

	printf("%s\n", buff);

	fclose(fp);
	return 0;
}
注意:
  • fread和fwrite可用来读写字符型文件,也可以用来读写二进制文件
  • fread和fwrite大多数场景用在读写固定大小的数据,如结构体

文件流定位函数

int fseek(FILE *stream, long offset, int whence)

  • 功能:实现文件流中的文件位置定位符的偏移
  • 参数:stream:要偏移的文件流
  • offset:偏移量
  • whence:偏移的起始位置
  • SEEK_SET:文件开头 offset > 0
  • SEEK_CUR:当前读写位置 offset可正可负
  • SEER_END:文件末尾 offset可正可负
  • 返回值: 成功:0 失败:-1

long ftell(FILE *stream)

  • 功能:获取当前流所在位置到文件开头的偏移量

void rewind(FILE *stream)

  • 功能:流复位,将流定位到文件开头
获取文件的大小:
  1. fseek(fp, 0, SEEK_END);
  2. len = ftell(fp);
  3. rewind(fp);
其他:

int fprintf(FILE *stream, const char *format, ...);

  • 功能:将格式化后的数据输出到文件

int sprintf(char *str, const char *format, ...);

  • 功能:格式化后的字符串保存在内存

文件IO

Linux内核向应用层提供的文件操作方法,属于Linux系统调用。

  1. 打开文件 open
  2. 读写文件 read/write
  3. 关闭文件 close

函数接口

open
  • int open(const char *pathname, int flags);
  • int open(const char *pathname, int flags, mode_t mode);
  • 功能:打开一个文件
  • 参数:
  • pathname:要打开文件的文件名
  • flags:打开方式
  • O_RDONLY :只读 "r" O_RDONLY
  • O_WRONLY :只写 "r+" O_RDWR
  • O_RDWR :可读可写 "w" O_WRONLY | O_CREAT | O_TRUNC
  • O_CREAT :创建 "w+" O_RDWR | O_CREAT | O_TRUNC
  • O_APPEND :追加 "a" O_WRONLY | O_CREAT | O_APPEND
  • O_TRUNC :清空 "a+" O_RDWR | O_CREAT | O_APPEND
  • mode :当前用户、同组用户、其他人对文件的读写执行权限
  • *当flags标志位中存在O_CREAT方式,则必须增加mode参数
  • 111 111 111 -----》0777
  • mode & ~umask
  • 注意:创建普通文件时,mode给到0664足够
  • 返回值: 成功:文件描述符 失败:-1

文件描述符

  • 小的,非负的整形数据,1024个(0-1023)
  • 操作系统为已打开的文件分配的一个标识符
  • 分配原则:最小未被使用原则
  • 文件IO操作文件面向文件描述符

注意:操作系统默认已经打开了三个文件:标准输入设备、标准输出设备、标准出错设备

  • 文件描述符fd 文件流指针FILE*
  • 标准输入设备 - ->>0 - ->>stdin
  • 标准输出设备 - ->>1 - ->>stdout
  • 标准出错设备 - ->>2 - ->>stderr
close
  • int close(int fd)
  • 功能:关闭文件
  • 注意:对于打开的文件使用完时,要及时关闭
  • 由于文件描述符个数有限,光打开文件不关闭,会造成文件描述符泄露
write
  • ssize_t write(int fd, const void *buf, size_t count);
  • 功能:向文件中写入数据
  • 参数:
  • fd:要写的文件的文件描述符
  • buf:要写入的数据首地址
  • count:要写入的字节数
  • 返回值: 成功:返回实际写入的字节数 失败:-1
cs 复制代码
#include "head.h"

int main(int argc, const char *argv[])
{
	int fd = open("1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
	if (fd < 0)
	{
		printf("open error\n");
		return -1;
	}

	int cnt = 100;
	char str[] = {"how are you"};

	ssize_t size = write(fd, "hello world", strlen("hello world"));
	printf("size = %ld\n", size);

	write(fd, str, strlen(str));
	
	write(fd, &cnt, sizeof(int));

	close(fd);
	return 0;
}
read
  • ssize_t read(int fd, void *buf, size_t count);
  • 功能:从文件中读数据
  • 参数:
  • fd:文件描述符
  • buf:存储数据的空间首地址
  • count:期望读到的字节数
  • 返回值:成功:返回实际读到的字节数 失败:-1 到达文件末尾:0
cs 复制代码
#include "head.h"

int main(int argc, const char *argv[])
{
	int fd = open("1.txt", O_RDONLY);	
	if (fd < 0)
	{
		printf("open error\n");
		return -1;
	}
	char buff[512] = {0};
	
	ssize_t size = read(fd, buff, sizeof(buff));
	printf("size = %ld, buff = %s\n", size, buff);
		
	size = read(fd, buff, sizeof(buff));
	printf("size = %ld, buff = %s\n", size, buff);

	close(fd);
	return 0;
}
相关推荐
SuperByteMaster7 分钟前
freertos 任务创建方式
c语言
Data_Journal25 分钟前
使用 AutoScraper 进行网页抓取:分步教程
大数据·开发语言·数据库·python·scrapy
yume_sibai41 分钟前
12-Rust 性能优化指南(性能分析 + 内存优化 + SIMD + 并发优化 + 编译器优化 + 基准测试)
开发语言·性能优化·rust
萧瑟余晖1 小时前
Hibernate 核心原理与架构详解
开发语言·架构·hibernate
爱喝水的鱼丶1 小时前
SAP-ABAP:SAP MM 模块物料主数据批量导入与增强开发:字段扩展、校验逻辑与批量导入工具开发
开发语言·性能优化·sap·abap·增强·经验交流·mm
geovindu1 小时前
rust:Builder Pattern
开发语言·设计模式·rust·建造者模式
susplus1 小时前
【传感器DS18B20】51单片机上实现温度采集
c语言·51单片机·ds18b20·温度采集
白远山1 小时前
健身场馆无人自动化解决方案:从架构到落地实践
java·开发语言·数据库·数据挖掘·需求分析
Data_Journal2 小时前
如何将网页抓取用于机器学习
大数据·开发语言·数据库·python·scrapy
郝学胜-神的一滴2 小时前
Effective Python 条款 13:善用星号解包,告别下标切片拆分的坑
服务器·开发语言·数据结构·python·程序人生·pycharm