c语言 文件

1.格式化的输入和输出

  printf   格式化字符串 %[flags][width][.prec][hlL]type

  flags:

     -  :   左对齐

    +  :  前面带正负号

    0  :  0填充  

    space:  正数留空

  

    number  :  最小字符数

    *     :  下一个参数是字符数    //例如 printf("%*d",6,123)    输出   123(123前面有3空格)

  .prec

    .number  :  小数点后的位数

    .*    :  下一个参数是小数点后的位数

  hlL:

    hh     :  单个字节

    h    :  short

    l    :  long

    ll    :  long long

    L    :  long double

  type:

    

  注意 %n,后面要给一个参数num,表示将输出或者读入的个数写入num所在内存中

  scanf:  %[flag]type

  flag:  

    

    type:

  

2.scanf和printf的返回值

  scanf会返回读入的项目数

  printf会返回输出的字符数(换行也算)

3.文件输入输出

  linux terminal 中, ./执行文件a  >  文件名b    表示将a程序的执行结果写入到b文件中

           ./执行文件a  <   文件名b    表示将文件b中的数据作为输入,输入给程序a   

4.程序中使用文件的相关函数

  a. FILE* fp= fopen(const char* restrict path,const char* restrict mode);  //打开文件,第一个是文件名,第二个是读写方式。fopen函数会返回NULL(如果要打开的文件不存在),或者该文件

    FILE的本质:

      FILE本质上是一个结构体,这个结构体中包含了文件相关的一些数据信息

if((fp=fopen("abc.txt","r"))==NULL)}
  printf("File open error!
");
  exit(0);   //exit(0)是系统标准函数,作用是关闭所有打开的文件,并终止程序的执行          
}

    文件一旦打开,对该文件的操作方式就确定了。

    c语言允许同时打开多个文件,但是同一个文件在关闭之前不能再次被打开。

  b. int fclose(FILE *stream);  

    关闭文件,该函数返回一个整数,若返回值为0表示正常关闭文件,否则表示无法正常关闭文件。

if(fclose(fp)){
    printf("Can not close the file
");
    exit(0);      
}

    文件使用完之后应当关闭,因为c语言在向文件中写入东西的时候,实际上是把内容写到了一个文件缓冲区(内存)中,通常当文件缓冲区满了之后,操作系统会把缓冲区中的内容写到磁盘上,然后把缓冲区清零,但是最后写入缓冲区的内容不会被写到磁盘上去,而fclose函数可以保证把最后缓冲区中的内容写回磁盘。

    此外,fclose函数还会释放掉文件缓冲区以及FILE结构体。

  c.文件读函数

    char fgetc(FILE* fp)  //从fp所指向的文件中读出一个字符并返回,若读到文件末尾,则返回EOF

    char *fgets(char *str,int n,FILE* fp)  //str可以是字符数组名或字符指针,n是指定读入的字符的个数,fp是文件指针。实际最多只能读取n-1个字符,还有一个是‘’,当读取的时候达到指定字符个数、或遇到换行符,或到达文件末尾的EOF的时候,将会在读取的字符后面自动添加'',其中换行符会被保留,EOF不会被保留。如果文件以及到达末尾(此时再使用fgets)或读取过程中发生异常,fgets会返回NULL。

    fscanf(FILE* fp, 格式字符串(%d %s...可以有多个),输入表)   

  d. 文件写函数

    int fputc(int ch,FILE* fp)  //将ch的ASCII码对应的字符写入文件中,若写文件成功,则返回ch,否则返回EOF

    fputs(const char *str,FILE* fp)  //用来向指定的文本文件写入一个字符串,其中str可以是字符数组名,字符型指针变量或者字符串常量。其中字符串结尾的''不会被写入文件,若函数执行成功,贼返回所写的最后一个字符/0/非负整数(不同编译器不同),否则返回EOF。

    fprintf(FILE*,格式字符串,输出表)

  e. fopen 的第二个参数见下图 

5.二进制文件

  其实所有的文件最终都是二进制的

  二进制读写

    size_t fread(void *restrict ptr,size_t size, size_t nitems,FILE *restrict stream);    //返回值是成功读写的字节数

    size_t fwrite(const void* restrict ptr,size_t size,size_t nitems,FILE *restrict stream);    //二进制读写往往是对结构体读写,ptr表示开始读写数据的地址的指针,size表示结构体大小,nitems表示有几个这样的结构体,stream表示写到这个文件中去

  在文件中定位

    void rewind(FILE *stream)    //将文件重新定位到文件头

    long ftell(FILE *stream);      //获取文件读写指针的当前位置,返回相对于文件头的位移量(字节数)

    int feof(FILE* fp)  //检测所指示文件是否到达了文件末尾,若是返回非0值,否则返回0

    int fseek(FILE *stream,long offset,int whence);    //stream为文件指针,offset为偏移量,如果使用常量,应该加L。函数执行成功返回0,否则返回 一个非零值

    其中whence的可选值(对应的实值分别是0,1,2):

      SEEK_SET  :  从头开始  

      SEEK_CUR  :  从当前位置开始

      SEEK_END  :  从末尾开始

       例:fseek(fp,20L,0)  //表示把文件指针移动到距离文件头部20字节处

6.位运算

  C语言中的按运算符:

    &  按位的与      //对应位为1时 结果为1  

        常用于取某一个数据中的一段或者一位

    |  按位的或      //对应位有一个为1时 结果为1

        常用于使得一位或几位为1、把两个数拼接起来

    ~  按位取反      //每一位把1变0,0变1(注意和取补码不同)

    ^  按位异或      //两个位相等,结果为0,不等结果为1.

        A^B=C,  C^B=A  //同一个数异或两次值不变  //可以用B给A编码加密,解密时只需要用B再去异或一次就可以了

        异或可以用来判断两个数是否相等,如果A,B相等,那么A^B=0

    <<  左移    // i<<j   表示将i中的所有位向左移动j个位置,右边用0补齐  x<<=n 等价于x*=2^n

    >>  右移    // i>>j  将i中所有位向右移动j个位置,左边用0补齐,但是符号位保持不变(如果是无符号类型,符号位不会保持不变)  x>>=n  等价于 x/=2^n

        注意 左移右移不要用负数

原文地址:https://www.cnblogs.com/foodie-nils/p/13629136.html