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)
- 功能:流复位,将流定位到文件开头
获取文件的大小:
- fseek(fp, 0, SEEK_END);
- len = ftell(fp);
- rewind(fp);
其他:
int fprintf(FILE *stream, const char *format, ...);
- 功能:将格式化后的数据输出到文件
int sprintf(char *str, const char *format, ...);
- 功能:格式化后的字符串保存在内存
文件IO
Linux内核向应用层提供的文件操作方法,属于Linux系统调用。
- 打开文件 open
- 读写文件 read/write
- 关闭文件 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;
}