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;
}
相关推荐
QT-Neal1 小时前
C++智能指针使用详解
开发语言·c++
JAVA9651 小时前
JAVA面试-并发篇 06-ReentrantLock如何实现公平锁的以及可重入吗
java·开发语言·面试
二等饼干~za8986682 小时前
geo优化系统源码搭建保姆式搭建教程
java·开发语言·django·php·音视频
SilentSamsara2 小时前
消息队列集成:Python + Kafka/RabbitMQ 生产实践
服务器·开发语言·分布式·python·kafka·rabbitmq
luj_17682 小时前
硝酸核关联假说缺乏实验证据
c语言·开发语言·c++·经验分享·算法
想你依然心痛2 小时前
Isaac Sim vs MuJoCo vs PyBullet:机器人仿真器选型终极指南(2026版)
java·开发语言·机器人
一个儒雅随和的男子2 小时前
MQTT如何保证消息的可靠性
java·开发语言
再玩一会儿看代码2 小时前
Java浅拷贝和深拷贝理解笔记
java·linux·开发语言·笔记·python·学习
爱吃羊的老虎2 小时前
【JAVA】Java微服务—分布式事务框架Seata
java·开发语言