Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182978
  • 博文数量: 54
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2018
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-31 23:14
文章存档

2014年(2)

2013年(52)

分类: 嵌入式

2013-08-21 19:13:25

一:文件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

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. int main (int argc, char *argv[])
  5. {
  6.     FILE *fp1 = NULL;
  7.     FILE *fp2 = NULL;
  8.     int ret;
  9.     if((fp1 = fopen(argv[1],"r")) == NULL)
  10.         fprintf(stderr, "fopen:%s", strerror(errno));
  11.     fp2 = fopen(argv[2],"w+");
  12.     while((ret = fgetc(fp1)) != EOF)
  13.     {
  14.         fputc(ret,fp2);
  15.     }
  16.     if(feof(fp1))
  17.             printf("to end\n");
  18.     if(ferror(fp1))
  19.             printf("to error\n");
  20.     return 0;
  21. }
        2:fputs

点击(此处)折叠或打开

  1. #include<stdio.h>

  2. int main (int argc, char *argv[]){
  3.     FILE *fp1,*fp2;
  4.     char ch[5];
  5.     fp1=fopen(argv[1],"r+");
  6.     fp2=fopen(argv[2],"w+");
  7.     while(fgets(ch,5,fp1)!=NULL)    
  8.         fputs(ch,fp2);    
  9.     fclose(fp1);
  10.     fclose(fp2);    
  11.     return 0;
  12. }

点击(此处)折叠或打开
  1. #include<stdio.h>

  2. int main (int argc, char *argv[]){
  3.     FILE *fp1,*fp2;
  4.     char ch[5];
  5.     fp1=fopen(argv[1],"r+");
  6.     fp2=fopen(argv[2],"w+");
  7.     while(fgets(ch,5,fp1)!=NULL)    
  8.         fputs(ch,fp2);    
  9.     fclose(fp1);
  10.     fclose(fp2);    
  11.     return 0;
  12. }
         3:fwrite

点击(此处)折叠或打开

  1. #include<stdio.h>

  2. int main (int argc, char *argv[]){
  3.     FILE *fp1,*fp2;
  4.     char ch[20];
  5.     int n;
  6.     fp1=fopen(argv[1],"r+");
  7.     fp2=fopen(argv[2],"w+");
  8.     while((n=fread(ch,1,20,fp1))==20)    //每次读取20(块)个1(每块大小),返回值是实际读取的块数
  9.         fwrite(ch,1,n,fp2);
  10.     fwrite(ch,1,n,fp2);    
  11.     fclose(fp1);
  12.     fclose(fp2);    
  13.     return 0;
  14. }
         复制二进制文件时使用fread--fwrite。

***********************************************************
四:静态库和动态库的制作和使用
    静态库:后缀为.a
                

点击(此处)折叠或打开

  1. fun.c
  2. #include <stdio.h>
  3. void fun(void)
  4. {
  5.     printf("hello!\n");
  6. }

  7. fun.h
  8. #include <stdio.h>
  9. void fun(void);

  10. main.c
  11. #include "fun.h"
  12. int main (int argc, char *argv[])
  13. {
  14.     fun();
  15.     return 0;
  16. }


                制作:用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了。此方法常用。 


阅读(2428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~