文件IO学习笔记

Map手册

Map 2 :查看系统调用的

Mao 3:查看库函数的

标准IO文件打开、关闭函数

FILE *fopen(const char *path , const char *mode)

FILE返回类型是一个结构体,称之为流

Path :包含文件名的路径

Mode

返回值:出错返回NULL,使用fopen函数必须判断是否为空

r:只读

w:只写

a:以只写方式打开文件,若文件不存在则创建,向文件写入的数被追加到文件内容末尾

a+以读写方式打开文件

文件打开的代码:

标准IO的字符输入:

int fgetc(FILE *stream);  //函数

int getc(FILE*stream);    .//宏

int getchar(void);  //只能用来读取标准文件的输入,比如键盘输入,不能读取普通文件内容

成功时返回读取的字符,若未读到文件返回-1

getchar()等同于fgetc(stdin)

getc和fgetc区别是一个是宏一个是函数

注意事项:

函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。

tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)

打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!

调用getchar会阻塞,等待你的键盘输入

字符输出

int  fputc(int c, FILE *stream);

int  putc(int c, FILE *stream);

int  putchar(int c);

成功时返回写入的字符;出错时返回EOF

putchar(c)等同于fputc(c, stdout)

行输入(读取整个行):

char  *gets(char *s);  读取标准输入到缓冲区s(指针指向的空间)

char *fgets(char *s, int size, FILE *stream);

读取的位置:FLIE * stream

缓冲区大小:size

成功时返回s,到文件末尾或出错时返回NULL

遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

注意事项

fgets 函数第二个参数,输入的数据超出sizesize-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

行输出(写整行):

int  puts(const char *s);

int fputs(const char *s,  FILE *stream);

成功时返回非负整数;出错时返回EOF

puts将缓冲区s中的字符串输出到stdout,并追加’\n’

fputs将缓冲区s中的字符串输出到stream,不追加  ‘\n’

对象的读和写

二进制文件和文本文件区别:存储格式的区别(文本文件只能存储文本)

二进制读写:

size_t fread(void *ptr, size_t size, size_t n, FILE *fp);   //二进制文件读函数

void *ptr  读取内容放的位置指针

  size_t size 读取的块大小

size_t n 读取的个数

  FILE *fp  读取的文件指针

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);  二进制文件写函数

void *ptr  写文件的内容的位置指针

size_t size 写的块大小

size_t n 写的个数

  FILE *fp  要写的文件指针

注意:

文件写完之后,文件指针指向文件末尾。

标准IO:刷新流

一般读写操作,在内存中有一个缓冲流,只有当缓冲流写满时,才会写入磁盘满

刷新流可以回避这个特点,可以在缓冲流未满时写入磁盘

int fflush(FILE *fp);   //流刷新函数

成功时返回0;出错时返回EOF

将流缓冲区中的数据写入实际的文件

Linux下只能刷新输出缓冲区,输入缓冲区丢弃

如果输出到屏幕使用fflush(stdout)

流的定位:

long ftell(FILE *stream);

long fseek(FILE *stream, long offset,  int whence);

void rewind(FILE *stream);

fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END

SEEK_SET 从距文件开头 offset 位移量为新的读写位置

SEEK_CUR:以目前的读写位置往后增加 offset 个位移量

SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量

offset参数:偏移量,可正可负

注意事项:

1.文件的打开使用a模式 fseek无效

2.rewind(fp) 相当于 fseek(fp,0,SEEK_SET);

3.这三个函数只适用2G以下的文件

格式化输出

int fprintf(FILE *stream, const char *fmt, …);   //输出到文件

int sprintf(char *s, const char *fmt, …);       //输出到字符串上

成功时返回输出的字符个数;出错时返回EOF

printf 则是shuchu到屏幕

格式化输入

int fscanf(FILE *stream, const char *format, ...);    //输入到文件

int sscanf(const char *str, const char *format, ...);  //输入到字符

文件IO

系统调用IO或者系统IO(不同的操作系统,提供的IO接口不一样)

特点:

不提供缓冲机制、每次读写操作都引起系统调用

核心概念是文件描述符fd,能够访问各类型的文件

文件IOAPI

open close read write

文件描述符:

每打开的文件都对应一个文件描述符

文件描述符从0开始,依次递增

文件IO操作通过文件描述符来完成

0,1,2的含义:分别表示标准输入、标准输出、错误

标注IO预定3个流,程序运行时自动打开

Open介绍:文件IO打开

O_RDONLY    只读方式打开

O_WRONLY    可写方式打开

O_RDWR      读写方式打开

O_CREA       如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限

O_APPEND    以添加的方式打开文件,那么打开文件时先删除文件中原有数据

mode 被打开文件的存取权限,为8进制表示法

打开文件时使用两个函数

创建文件时第三个参数指定新文件的权限,真正建立文件时的权限受到umask值影响,实际权限是mode-umaks

可以打开设备文件,不能创建设备文件,创建设备文件使用mknode

权限联合使用:

O_WRONLY | O_CREAT | O_TRUNC, 0664    

O_RDWR | O_CREAT | O_TRUNC, 0664

O_WRONLY | O_CREAT | O_APPEND, 0664

O_RDWR | O_CREAT | O_APPEND, 0664

umask:用于设定文件文件或者目录的初始权限

是文件和目录的真正初始权限

文件或目录的初始权限 = 文件或目录的最大默认权限-umask权限

文件的关闭

int close(int fd)

注意:

求字符串长度使用sizeof ,对二进制数据使用strlen

printf的字符最后没有“\0”

目录操作

  1. 打开目录

DIR *opendir(const char *name)

DIR *fdopendir(int fd)    //需要使用open函数返回一个文件描述符

DIR是用来描述一个打开的目录文件的结构体类型,成功返回目录流指针,出错返回NULL

  1. 读取目录

Struct dirent *readdir(DIR *dirp);

struct dirent是用来描述目录流中一个目录项的结构体类型

成功时返回目录流dirp中下一个目录项;出错或到末尾时时返回NULL

3)  关闭目录

       int closedir(DIR *dirp);

修改文件权限(查看权限用ll

Chmod、fchmod函数用来修改文件的访问权限

int  chmod(const char *path, mode_t mode);

int  fchmod(int fd, mode_t mode);

获取文件属性

int  stat(const char *path, struct stat *buf);    //

int  lstat(const char *path, struct stat *buf);   //获取的是链接文件的属性

int  fstat(int fd, struct stat *buf);

成功时返回0;出错时返回EOF

如果path是符号链接stat获取的是目标文件的属性;而lstat获取的是链接文件的属性

Stat结构体

库的概念

创建静态库的步骤:

  1. 编写库文件代码,编译为.o目标文件
  2.  用ar命令创建libxxx.a文件

ar -rsv  libxxxx.a  xxxx.o

静态库文件要以lib开头,后缀名为.a

没有main函数的.c文件不能生成可执行文件

链接静态库

gcc –o 目标文件 源码.c –L 路径  -l XXX

-L表示库所在的路径

-I 后面跟库的名称

动态库的生成步骤:

  1. 生成与位置无关的目标文件

gcc  –c  –fPIC  xxx.c  xxxxx.c  …

2) 生成动态库

       gcc  -shared  -o  libxxx.so  xxx.o  xxxxx.o

  1. 编译可执行文件

gcc –o 目标文件  源码.c –L 路径 –lxxx

为了让系统能够找到加载的共享库,有三种方法:

  1. 把库拷贝到/usr/lib和/lib目录下
  2. 在LD_LIBRARY_PATH环境变量中添加库所在路径
  3. 添加/etc/ld.so/conf.d/*.conf文件, 执行ldconfig刷新

查看可执行文件使用的动态库

Lld命令:ldd 可执行文件

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值