C语言学习笔记(四)

Posted by alonealice on 2017-03-06

文件和内存管理

  1. 文件类型为FILE,typedef定义数据类型,使用时一般使用文件指针:FILE *pFile

  2. 文件打开:FILE *pFile;pFile=fopen(“文件名”,使用方式);使用方式有以下:r(只读文本文件),w(只写文本文件),a(追加文本文件,在末尾加内容),rb(只读二进制文件),wb(只写二进制文件),ab(追加二进制文件),r+(打开文件文本,可读可写),w+(打开或新建文本文件,可读可写),a+(打开文件文本,可读可在末尾写),rb+,wb+,ab+

  3. 文件关闭fclose(文件指针),关闭成功返回0,失败EOF

  4. fputc(字符,文件指针),将字符写入文件;fgetc(文件指针)将文件内容读取一个一个读取;fputs(字符串,文件指针),将字符写入文件;fgets(数组,长度n,文件指针)将文件内容n读取出来存到数组

  5. fprintf(文件指针,格式字符串,输出列表):fprintf(fp,”%d”,i)将i以规定格式写到文件;fscanf(文件指针,格式,输入列表)读入文件中的中值以该格式写到i

  6. fread(buffer,size,count,fp)意思是冲fp的文件中读取count次,每次读size字节,写到buffer的地址中;fwrite(buffer,size,count,fp)将buffer的size字节的数据写到fp文件中,写入count次

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    文件读取,写入例子
    FILE* file=fopen("a.txt","w+");
    if(file==NULL){
    puts("无法打开文件");
    }
    fputs("1234567890",file);
    fclose(file);

    a文件的内容结果(会将原来的内容清掉):
    1234567890

    FILE* file=fopen("a.txt","r+");
    char r[30];
    fgets(r, sizeof(r),file);
    printf("输出%s",r);
    fclose(file);

    结果:输出1234567890

    FILE* file=fopen("a.txt","w");
    fprintf(file,"输入的数字%d",3);
    fclose(file);
    结果:a文件的内容是:输入的数字3

    (a里面内容是1234567890)
    int c;
    FILE* file=fopen("a.txt","r");
    fscanf(file,"%c",&c);
    putchar(c);
    fclose(file);

    结果:1

    int* c[8];
    FILE* file=fopen("a.txt","r");
    fread(&c,10,2,file);
    printf("%s",c);
    fclose(file);

    结果:12345678

    char* c="123";
    FILE* file=fopen("a.txt","w");
    fwrite(c, strlen(c),1,file);
    fclose(file);
    结果:文件内容:123
  7. 程序被装载在计算机上时,会被组织成4个逻辑段:可执行代码,静态数据,动态数据(堆),栈(局部数据对象,函数的参数,调用函数和被调函数的关系

  8. fseek(文件指针,位移量,起始点),移动文件的指针位置(可以用来在文件中间读取修改内容);fewind(文件指针),指针重新指到文件起始位置;ftell(文件指针)获取当前指针位置与文件开头位置的偏移量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char c[30];
    FILE* file=fopen("a.txt","r");
    fgets(&c, 15,file);
    printf("%s\n",c);
    fseek(file,1L,0);
    fgets(&c, 15,file);
    printf("%s",c);
    fclose(file);
    结果:
    123
    23
  9. 动态管理(stdlib.h中):*malloc(unsigned int size),申请内存,返回指针;calloc(unsignedn,unsigned size),申请n个size大小的连续内存数组,返回指针;realloc(void *ptr,size_t size)将指针ptr的空间大小该为size,既可以变大,也可以变小;free(*ptr)释放内存

  10. 内存丢失就是原来指向一个内存区域的指针指向了另一个内存区域,导致之前的内存区域无法释放管理,就是内存丢失。

网络嵌套字

  1. 使用socket TCP时,使用send和recv接受发送数据,UDP时,使用recvfrom和sendto接受发送数据。

  2. WSAStartup函数,初始化套接字库(必须),WSAStartup(WORD,LPWSADATA),传入的数据window socket版本和WSADATA指针

  3. socket(int af,int type,intprotocol) a

af:表示一个地址家族,通常为AF_INET

type:表示套接字类型,SOCK_STREAM表示创建面向连接的流式套接字;SOCK_DGRAM表示创建面向无连接的数据报套接字;SOCK_RAW表示创建原始套接字;protocol:表示套接口所用的协议,不确定设置0

调用成功返回SOCKET

  1. bind(SOCKET s,const structsockaddr FAR* name,int namelen):服务端要用。将套接字绑定在指定的端口和地址上。s:表示套接字;是一个sockaddr结构指针,当中包含了要结合的地址和端口号;namelen是name缓冲区域的长度;成功返回0,失败返回SOCKET_ERROR

  2. listen(SOCKET socket,intbacklog):backlog表示等待连接的最大队列长度,如果设置为2,那个前两个连接时会放置在等待队列中,第三个客户端连接时会报错

  3. accept(SOCKET s,struct sockaddFAR* addr ,int FAR* addrlen)addr: 是一个sockaddr结构指针,当中包含了要结合的地址和端口号;addrlen用于接收addr的长度,返回值表示已经接受的客户端连接,后续都用新的socket

  4. closesocket(SOCKET s)关闭socket

  5. connect(SOCKET s,const structsockaddr FAR* name,int namelen),值与bind一样(子机)

  6. u_short Htons(u_short hostshort):将16位的无符号短整型数据由主机排列方式转换到网络排列方式。hostshort:一个主机排列方式的16位的无符号短整型数据;返回值:一个16位网络排列方式的数据

  7. u_long Htonl(u_long hostlong);Htons一样,16位长整型数据

  8. unsigned long iner_addr(constchar FAR* cp):cp表示地址的字符串,返回32位无符号长整型

  9. recv(SOCKET s,const char FARbuf,int len,int flags):buf表示接收数据的缓存区,len表示buf的长度,flags表示函数的调用方式,如果是MSG_PEEK表示查看传来的数据,在序列前段的数据会被复制一份到返回缓冲区中,但是这个数据不会从序列中移走;如果是MSG_OOB,就说明是外带数据(一般传0)

  10. *send(SOCKET s,const char FARbuf,int len,int flags),字段意思跟recv一样

  11. *recvfrom(SOCKET s, char FARbuf, int len,int flags, struct socketaddr FAR from,int FAR* fromlen):前面跟之前的一样,from是一个指向地址结构的指针,用来接收发送方的地址信息;fromlen是缓冲区的长度

  12. sendfrom(SOCKET s, char FARbuf, int len,int flags, struct socketaddr FAR to,int FAR* tolen)与recvfrom一样

  13. WASCleanup()用来释放初始化时的资源