一:文件IO和标准IO有什么区别?
文件io直接调用系统函数,无缓冲,操作对象是文件描述符,底层调用;
标准io是对文件io的封装,具有通用性,相比文件io移植性好,具有缓冲,操作文件流指针,上层调用。
**********************************************************
二:1,对于有缓冲的标准I/O:当缓冲满后才进行输入输出,比如stdout(默认为屏幕)。
程序未运行完,且缓冲没有满时是不会打印到屏幕的(\n会刷新冲缓冲进行打印)。这时可以使用fflush(stdout); 强制刷新输出缓冲内容。fflush使所有该流未写的数据都被强制传递到内核处理。
2,使用-exit(-1);可以达到程序异常退出;exit(-1)为正常退出。
3,标准I/O预定义3个流程序打开时自动打开;
标准输入:0 stdin
标准输出:1 stdout
标准错误
输出:2 stderr
4,输出错误信息:
perror:perror(“xxx”);
打印:xxx:错误原因;
或者:fprintf(stderr,"xxx:%s\n",strerror(errno));
***********************************************************
三:复制三种方式:
1:fputc
-
#include <stdio.h>
-
#include <string.h>
-
#include <errno.h>
-
int main (int argc, char *argv[])
-
{
-
FILE *fp1 = NULL;
-
FILE *fp2 = NULL;
-
int ret;
-
if((fp1 = fopen(argv[1],"r")) == NULL)
-
fprintf(stderr, "fopen:%s", strerror(errno));
-
fp2 = fopen(argv[2],"w+");
-
while((ret = fgetc(fp1)) != EOF)
-
{
-
fputc(ret,fp2);
-
}
-
if(feof(fp1))
-
printf("to end\n");
-
if(ferror(fp1))
-
printf("to error\n");
-
return 0;
-
}
2:fputs
-
#include<stdio.h>
-
-
int main (int argc, char *argv[]){
-
FILE *fp1,*fp2;
-
char ch[5];
-
fp1=fopen(argv[1],"r+");
-
fp2=fopen(argv[2],"w+");
-
while(fgets(ch,5,fp1)!=NULL)
-
fputs(ch,fp2);
-
fclose(fp1);
-
fclose(fp2);
-
return 0;
-
}
点击(此处)折叠或打开
-
#include<stdio.h>
-
-
int main (int argc, char *argv[]){
-
FILE *fp1,*fp2;
-
char ch[5];
-
fp1=fopen(argv[1],"r+");
-
fp2=fopen(argv[2],"w+");
-
while(fgets(ch,5,fp1)!=NULL)
-
fputs(ch,fp2);
-
fclose(fp1);
-
fclose(fp2);
-
return 0;
-
}
3:fwrite
-
#include<stdio.h>
-
-
int main (int argc, char *argv[]){
-
FILE *fp1,*fp2;
-
char ch[20];
-
int n;
-
fp1=fopen(argv[1],"r+");
-
fp2=fopen(argv[2],"w+");
-
while((n=fread(ch,1,20,fp1))==20) //每次读取20(块)个1(每块大小),返回值是实际读取的块数
-
fwrite(ch,1,n,fp2);
-
fwrite(ch,1,n,fp2);
-
fclose(fp1);
-
fclose(fp2);
-
return 0;
-
}
复制二进制文件时使用fread--fwrite。
***********************************************************
四:静态库和动态库的制作和使用
静态库:后缀为.a
-
fun.c
-
#include <stdio.h>
-
void fun(void)
-
{
-
printf("hello!\n");
-
}
-
-
fun.h
-
#include <stdio.h>
-
void fun(void);
-
-
main.c
-
#include "fun.h"
-
int main (int argc, char *argv[])
-
{
-
fun();
-
return 0;
-
}
制作:用gcc创建库文件已写可以被main.c调用的fun.c文件
ar crs libfun.a fun.c//静态库文件名命名规范是以lib为前缀的,紧接着静态库名,扩展名为.a,生成libfun.a
使用:
gcc -o hello main.c -L. -lfun//-L后接静态库的路径名,.表示当前路径。-L.表示要连接的库在当前目录。
动态库:后缀为.so
制作:用gcc创建动态库。
gcc -fPIC -Wall -c fun.c//-fPIC创建与地址无关的编译程序。
gcc -shared -o libfun.so fun.o
使用:
gcc main.c -lfun//默认生成a.out可执行文件。当执行./a.out时需要将libfun.so文件放入默认/lib目录下才能执行。
这里动态库的执行依赖动态载入器找到库文件。/lib只是找寻的目录之一;
动态载入器会依次寻找1,DT_RPATH段
2,环境变量LD_LIBRARY_PATH
3,/etc/ld.so.cache文件列表
4,/lib/, /usr/lib/目录
当生成a.out可执行文件后,常常有以下方法加载动态库:
1,将库文件放在默认库目录下/lib/, /usr/lib/
2,修改环境变量LD_LIBRARY_PATH(增加库存放的路径)
3,在/etc/ld.so.conf.d/目录下添加路径文件/etc/ld.so.conf.d/fun.conf,然后运行ldconfig /etc/ld.so.conf.d/fun.conf刷新文件,这样就可以正常运行a.out了。此方法常用。
阅读(2476) | 评论(0) | 转发(0) |