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;
}
相关推荐
wdfk_prog2 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
wdfk_prog4 小时前
嵌入式面试真题第 11 题:RTOS 优先级翻转与实时任务阻塞的通用治理
c语言·缓存·面试·职场和发展·架构
许彰午5 小时前
95_Python内存管理与垃圾回收
开发语言·python
多加点辣也没关系6 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜6 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
chouchuang8 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
云空8 小时前
《Three.js 3D实例大全》
开发语言·javascript·3d·three.js
techdashen9 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang
C137的本贾尼9 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件
从零开始的代码生活_10 小时前
C++ list 原理与实践:双向链表、迭代器与简化实现
开发语言·c++·后端·学习·算法·链表·list