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;
}
相关推荐
qq_5896660510 分钟前
C语言、C++与C#的区别详解
c语言·c++·c#
Data_Journal36 分钟前
如何使用 Python 抓取 Google Flights:分步指南
大数据·开发语言·数据库·python·scrapy
一直C1 小时前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
Kismet_nvi1 小时前
Python 基础核心知识点总结
开发语言·windows·python
爱学习的小邓同学1 小时前
Golang语言入门
开发语言·后端·golang
编码浪子2 小时前
Rust 智能指针深度实战:Box/Rc/Arc/RefCell 选型决策与内存管理避坑
开发语言·后端·rust
yichudu2 小时前
Python 装饰器 decorator
开发语言·python
电商API_180079052472 小时前
速卖通商品采集API技术文章
java·开发语言·c++·api·跨境电商·商品详情
一晌小贪欢2 小时前
Python办公14:批量解压文件夹内的所有 ZIP/RAR 并自动分类
开发语言·python·excel·数据可视化·python办公
郑州光合科技余经理2 小时前
海外版外卖系统架构:订单怎么流转、权限怎么分
java·开发语言·前端·系统架构·uni-app·php·ai编程