首页 >> 大全

linux高级编程——IO

2024-01-07 大全 30 作者:考证青年

: 当前位置为文件的开头,新位置为偏移量的大小(后移为正,前移为负)

: 当前位置为文件指针的位置,新位置为当前位置加偏移量

: 当前位置为文件的结尾,新位置为文件大小加偏移量的大小

返回值

成功:文件当前的位置

出错:-1

******************************************************************************************************************************************************************************

文件IO:是直接调用内核提供的系统调用函数,头文件:.h

标准IO:是间接点用系统调用函数,头文件: stdio.h

三个缓存:

1,程序中的缓存,就是你想从内核读写的缓存(数组)——用户空间的缓存

2,每打开一个文件,内核在内核空间中也会开辟一块缓存,——内核空间缓存

文件IO的 写 ——> 将用户空间的缓存写到内核空间的缓存中

文件IO的 读 ——>将内核空间的缓存读到用户空间的缓存

3,标准IO的库函数中也有一个缓存 —— 库缓存

2,标准IO

满足一定条件才能将库缓存的内容写到内核:遇到\n;库缓存写满时,会调用系统调用函数。(库缓存为1024字节)

1)fopen打开

2) 关闭 ,在关闭之前刷新缓存区,强制写入内核

3) fseek,位置指针

4)读写函数较多(分三类:全缓存,行缓存,无缓存)

1) FILE *fopen (const char *path , const char *mode);创建一个文件设置的权限为666,生成文件的权限为 666&(~umask)

返回值:FILE * 文件流指针 类似于文件IO中的文件描述符

FILE 定义 : 在/usr//libio.h

包含读写缓存的首地址、大小、位置指针等

标准的输入流:stdin 0

标准的输出流: 1

标准的出错流: 2

参数:path 文件的位置

mode 相当于文件IO的flag (char * 字符串)

b :二进制文件

r :只读方式打开文件,文件必须存在

w/a : 只写方式打开文件,文件不存在则创建;

区别: w == ; a ==

+ : 读写方式打开文件,文件必须存在;

2)

3)读写函数

1, 行缓存遇到新行符(\n) 或写满缓存时,即调用系统调用函数

读: fgets,gets,,,

写: fputs,puts,scanf

2, 无缓存只要用户调用这个函数,就会将其内容写到内核中

3,全缓存只有写满缓存再调用系统调用函数

读 :fread

写 :

3.1 行缓存的读写函数fgets, fputs

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

参数:

s :缓存,即读到哪里去

size :读多少字节

:从什么地方读

返回值:

成功: s (缓存的地址)

已处于文件尾端或出错: null

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

参数:

s : 缓存。即写什么内容

:写到哪里去

返回值:

成功:非负值

出错:EOF -1

3.2 (FILE *fp)

把库函数的缓存内容强制写入内核(在 中包含)

3.3 无缓存:

行缓存

3.4 调整位置指针

fseek()

参数与lseek()一致,但返回值不同

返回值:

编程高级工程师年薪多少_编程高级工程师_

成功:0

失败:-1

(FILE *fp) 用于设定流的文件位置指示为文件开始,该函数调用成功无返回值。

() == (void) fseek(fp 0,);

ftell(FEIL *fp)

用于取得当前的文件位置,调用成功则为当前文件位置指示,出错则为 -1L;

3.5 行缓存的读写函数 gets , puts

char *gets (char *s);

int puts (const char *s);

gets 与 fgets 的区别:

gets() 时不能指定缓存的长度,可能造成缓存越界,写到缓存之后的存储空间,产生不可预料的后果;

gets()只能从标准输入中读;

gets() 并不将新行符存入缓存,fgets()将新行符存入缓存;

puts 与 fputs 的区别:

puts()只能向标准输出中写;

puts() 输出是会添加一个新行符,fputs() 不会添加;

3.6 , , 行缓存的函数

int (FILE *,"字符串格式")

可以输出到文件中,也可以输出到显示器eg: (fp,"hello linux");

只能输出到显示器

int (str *,"字符串格式")

输出内容到一个字符串中eg: char buf[128] = 0; (buf,"hello linux");

3.7 一个字符的读写函数

int fgetc(FILE *fp)将文件中的内容一个字符的输出到显示器,到文件结尾时返回EOF

功能: 从文件读取一个字符

参数: 文件流

返回值: 正确为读取到的字符;到文件结尾或出错时返回EOF

int fputc(int c, FILE *fp)输入一个字符到文件中,成功则返回输入的字符,出错则返回EOF

功能:写一个特字符到文件中

参数:第一个参数为要写的字符,第二个为文件流

返回值: 正确为返回输入的字符,出错返回EOF

fputs 有缓存,但不是行缓存

——————————————————————————————————————————————————————————————————————————————

编程高级工程师年薪多少__编程高级工程师

——————————————————————————————————————————————————————————————————————————————

3.8 feof 判断受否已经到文件结尾

int feof (FILE *);

参数:文件流

返回值:文件结束,返回非0;没有则返回0;

3.9 判断是否读写错误

int (FILE *);

参数:文件流

返回值: 是读写错误,返回非0;不是则返回0;

3.清除流错误

void (FILE *);

参数:文件流

————————————————————————————————————————————————————————————————————————————————

编程高级工程师年薪多少__编程高级工程师

————————————————————————————————————————————————————————————————————————————————

全缓存

fread 和 全缓存的读写函数

fread (void *ptr , size, nmemb,FILE *);

(const void *ptr, size, nmemb,FILE *);

参数:

ptr:写的内容

size:写的内容中,每一个单元所占的字节数

nmemb:写的内容中,有多少个单元

: 写到哪里去

总共所写的字节:size * nmemb

返回值: 实际读写的单元数

linux下静态库和动态库的制作与使用

.a , 在编译时就将库编译进可执行程序中。

优点:程序的运行环境中不需要外部的函数库

缺点:可执行程序大

又称共享库,.so ,在运行时将库加载到可执行程序中。

优点:可执行程序小

缺点:程序的运行环境中必须提供相应的库。

函数库目录:/lib /usr/lib

静态库的制作:

1,生成目标文件:gcc -c file.c

2,静态库创建命令 ar

ar -cr .a file.o

-c :

-r : ,表示当插入的模块 file.o 已经存在 .a 中,则覆盖。反之 ar 显示一个错误消息

1)由源文件生成目标文件 gcc -c -o sub.o sub.c

2)把目标文件生成静态库 ar -cr -o .a sub.o

3) gcc -o a main.c -L. -lsub. 代表当前目录;-lcub 默认.o

动态库制作:

1,生成目标文件 :gcc -c -o file.c

2,gcc - -fpic -o .so file.o

-fpic : 产生位置无关代码

-:生成共享库。

用上述命令生成 .so 动态函数库

gcc -o out main.c -L. -lsub

此时还不能直接 ./out ,因为在动态函数库使用时,会查找/usr/lib /lib 目录下的动态函数库,而此时生成的库还不在里边

解决方法:

1) 把 .so 放到 /usr/lib /lib 中去

2)假设 .so 在/home/linux/file 中 环境变量的方式

= /home/linux/

3) 在 /etc/l.so.conf 文件中加入生成库的路径,然后 /sbin/

/etc/ld.so.conf 时非常重要的一个目录,里面存放的时链接器和加载器搜索共享库时要检查的目录,默认是从 /usr/lib /lib 中读取,所以可以把库的目录假如这个文件并执行 /sbin/

目录IO

#

#

目录IO

文件IO

只能打开目录

mkdir 创建目录

open

读目录

read

调整指针位置

ftell

fseek

关闭目录

close

1,

DIR * (const char *);

参数:打开的目录及路径

返回值: 成功返回目录流指针,出错返回NULL

int mkdir (const char * path , mode )

path: 为想创建的目录文件路径

mode:为该目录的访问权限

返回值:若目录创建,则返回0;否则-1;

生成的目录权限仍和umask有关

2,

* (DIR *dr)

参数:目录流指针

返回值:成功 则为 指针,瑞在目录尾或出错则返回NULL

定义在头文件 .h中

此结构至少包括下列两个成员:

ino_t d_ino ; // inode 号

char [+1]; //文件名

3,: 重置读取目录的位置为开头

void (DIR *dr);

参数:目录流指针

long (DIR *dirp)读取当前指针的位置

参数:目录流指针

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了