文件和内存管理
-
文件类型为FILE,typedef定义数据类型,使用时一般使用文件指针:FILE *pFile
-
文件打开:FILE *pFile;pFile=fopen(“文件名”,使用方式);使用方式有以下:r(只读文本文件),w(只写文本文件),a(追加文本文件,在末尾加内容),rb(只读二进制文件),wb(只写二进制文件),ab(追加二进制文件),r+(打开文件文本,可读可写),w+(打开或新建文本文件,可读可写),a+(打开文件文本,可读可在末尾写),rb+,wb+,ab+
-
文件关闭fclose(文件指针),关闭成功返回0,失败EOF
-
fputc(字符,文件指针),将字符写入文件;fgetc(文件指针)将文件内容读取一个一个读取;fputs(字符串,文件指针),将字符写入文件;fgets(数组,长度n,文件指针)将文件内容n读取出来存到数组
-
fprintf(文件指针,格式字符串,输出列表):fprintf(fp,”%d”,i)将i以规定格式写到文件;fscanf(文件指针,格式,输入列表)读入文件中的中值以该格式写到i
-
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 -
程序被装载在计算机上时,会被组织成4个逻辑段:可执行代码,静态数据,动态数据(堆),栈(局部数据对象,函数的参数,调用函数和被调函数的关系
-
fseek(文件指针,位移量,起始点),移动文件的指针位置(可以用来在文件中间读取修改内容);fewind(文件指针),指针重新指到文件起始位置;ftell(文件指针)获取当前指针位置与文件开头位置的偏移量
1
2
3
4
5
6
7
8
9
10
11char 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 -
动态管理(stdlib.h中):*malloc(unsigned int size),申请内存,返回指针;calloc(unsignedn,unsigned size),申请n个size大小的连续内存数组,返回指针;realloc(void *ptr,size_t size)将指针ptr的空间大小该为size,既可以变大,也可以变小;free(*ptr)释放内存
-
内存丢失就是原来指向一个内存区域的指针指向了另一个内存区域,导致之前的内存区域无法释放管理,就是内存丢失。
网络嵌套字
-
使用socket TCP时,使用send和recv接受发送数据,UDP时,使用recvfrom和sendto接受发送数据。
-
WSAStartup函数,初始化套接字库(必须),WSAStartup(WORD,LPWSADATA),传入的数据window socket版本和WSADATA指针
-
socket(int af,int type,intprotocol) a
af:表示一个地址家族,通常为AF_INET
type:表示套接字类型,SOCK_STREAM表示创建面向连接的流式套接字;SOCK_DGRAM表示创建面向无连接的数据报套接字;SOCK_RAW表示创建原始套接字;protocol:表示套接口所用的协议,不确定设置0
调用成功返回SOCKET
-
bind(SOCKET s,const structsockaddr FAR* name,int namelen):服务端要用。将套接字绑定在指定的端口和地址上。s:表示套接字;是一个sockaddr结构指针,当中包含了要结合的地址和端口号;namelen是name缓冲区域的长度;成功返回0,失败返回SOCKET_ERROR
-
listen(SOCKET socket,intbacklog):backlog表示等待连接的最大队列长度,如果设置为2,那个前两个连接时会放置在等待队列中,第三个客户端连接时会报错
-
accept(SOCKET s,struct sockaddFAR* addr ,int FAR* addrlen)addr: 是一个sockaddr结构指针,当中包含了要结合的地址和端口号;addrlen用于接收addr的长度,返回值表示已经接受的客户端连接,后续都用新的socket
-
closesocket(SOCKET s)关闭socket
-
connect(SOCKET s,const structsockaddr FAR* name,int namelen),值与bind一样(子机)
-
u_short Htons(u_short hostshort):将16位的无符号短整型数据由主机排列方式转换到网络排列方式。hostshort:一个主机排列方式的16位的无符号短整型数据;返回值:一个16位网络排列方式的数据
-
u_long Htonl(u_long hostlong);Htons一样,16位长整型数据
-
unsigned long iner_addr(constchar FAR* cp):cp表示地址的字符串,返回32位无符号长整型
-
recv(SOCKET s,const char FARbuf,int len,int flags):buf表示接收数据的缓存区,len表示buf的长度,flags表示函数的调用方式,如果是MSG_PEEK表示查看传来的数据,在序列前段的数据会被复制一份到返回缓冲区中,但是这个数据不会从序列中移走;如果是MSG_OOB,就说明是外带数据(一般传0)
-
*send(SOCKET s,const char FARbuf,int len,int flags),字段意思跟recv一样
-
*recvfrom(SOCKET s, char FARbuf, int len,int flags, struct socketaddr FAR from,int FAR* fromlen):前面跟之前的一样,from是一个指向地址结构的指针,用来接收发送方的地址信息;fromlen是缓冲区的长度
-
sendfrom(SOCKET s, char FARbuf, int len,int flags, struct socketaddr FAR to,int FAR* tolen)与recvfrom一样
-
WASCleanup()用来释放初始化时的资源