fwirte和fread函数
都是全缓存函数
fread和fwrite函数
size_t fread(void *ptr,size_t size, size_ number,FILE *stream);
size_t fwrite(const void *ptr,size_t size, size_ number,FILE stream);
功能:全缓存的读写函数
第一个参数 buf:写的内容
第四个参数 fp:写到哪里去
第二个参数 size:写的内容中,每一个单元所占的字节数
第三个参数 nmemb:写的内容中,有多少个单元数
总共写多少个字节,sizenmemb
返回值:实际写的单元数。
fwrite和fread实现
效率对比fgetc——read
fgetc和fgers效率对比
同样拷贝文件之下fread的效率较高
fread、fwrite > fgets 、fputs > fgetc 、fputc > read、wirte
制作静态库和动态库
1、静态库,libxxx.a,在编译时就将库编译进可执行程序中。
优点:程序的运行环境中不需要外部的函数库。
缺点:可执行程序大,可执行文件大
2、动态库,又称共享库,libxxx.so,在运行时将库加载到可执行程序中。
优点:可执行程序小,可执行文件大
缺点:程序的运行环境中必须提供相应的库。
静态库是在.c文件gcc时将.a文件一起加进来编译,是在编译阶段
动态库是.c文件gcc时不调用,而是在运行时./a.out的时候才调用,是在运行阶段
函数库目录:/lib /usr/lib。
静态库:.c文件gcc-o生成.o文件再通过ar命令生成.a文件
比如写两个函数,先编译库函数生成.o文件再通过ar -cr 命令生成静态库,最后在主函数调用时在链接它的静态库
同理编写动态库
动态函数库的制作:
- 生成目标文件:gcc -c file.c
- gcc -shared -fpic -o libfile.so file.o
-fpic:产生位置无关代码。
-shared:生成共享库。
用上述命令生成libaddsub.so 动态函数库。
gcc -o out main.c -L. -lfile
此时还不能立即./out,因为在动态函数库使用时,会查找/usr/lib /lib目录下的动态函数库,而此时我们生成的库不在里边。
第一种方法:
libaddsub.so放到/usr/lib 或/lib中去。
第二种方法,假设libfile.so在/home/linux/file 环境变量方法
export LD_LIBRARY_PATH=/home/linux/addsub:$LD_LIBRARY_PATH
第三种方法:
在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。
在这里我们用第一种方法
也是s1.c和sub.c函数,通过gcc -shared -fpic命令编译成.so文件 再调用链接库,再运行发现运行不了,是因为没有调用库,所以要将编译的动态库添加到库目录中,通过mv命令将.so 文件移动到库目录中,最后才能运行