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;
}
相关推荐
geovindu11 小时前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
“AI国潮设计-小江”11 小时前
《Python+SDXL实战:用ControlNet批量生成“英歌舞麻将糕”IP,附自动化脚本与商用思路》
开发语言·人工智能·python·prompt·aigc
Cc.Y11 小时前
Java零基础入门:封装与继承 —— 从“裸奔“到“穿衣服“,从“重复造轮子“到“站在巨人肩膀上“
java·开发语言
Escalating_xu11 小时前
【C 语言】深入理解指针(4):回调函数、qsort、void * 与泛型排序的模拟实现
java·c语言·开发语言
吠品11 小时前
GitHub 周榜拆解:决策小模型扎堆上位
c语言·开发语言·算法
见叶之秋12 小时前
C++ 泛型世界的两块拼图:容器适配器与仿函数
java·开发语言
逗脑IDE12 小时前
零基础学ESP32:RFID无线射频卡——让ESP32拥有“刷卡“能力!
开发语言·网络·人工智能·python·esp32·硬件开发
小师兄吃牛肉12 小时前
C语言篇:内联函数
c语言·开发语言
yuniko-n13 小时前
【Java】字符串相关坑点
java·开发语言·python
白山编程大哥13 小时前
C语言篇:语法进阶
c语言·数据结构·算法