1.getline()
ssize_t getline(char **lineptr,size_t *n,FILE *stream);
返回值是成功读到的字符个数,但是不包括尾‘\0’。失败返回-1
ssize_t getdelim(char ** lineptr,size_t *n,int delim,FILE *stream);
需要在包含头文件之前加入#define _GNU_SOURCE
程序
1 #define _GUN_SOURCE
2 #include "stdio.h"
3 #include "string.h"
4 #include <stdlib.h>
5 int main(int argc,char **argv)
6 {
7 if(argc<2)
8 {
9 fprintf(stderr,"Usage .....\n");
10 exit(1);
11 }
12 FILE *fd;
13 char * linebuf;
14 size_t linesize;
15 linebuf=NULL;
16 linesize=0;
17 fd=fopen(argv[1],"r");
18 if(fd==NULL)
19 {
20
21 perror("fopen()");
22 exit(1);
23 }
24 while(1)
25 {
26 if(getline(&linebuf,&linesize,fd)<0)
27 break;
28 printf("%ld\n",strlen(linebuf));
29 printf("%ld\n",linesize);
30 }
31 fclose(fd);
32 exit(0);
33 }
34
输出结果为第一行为每行大小,第二行为120以此类推。
getline的原理malloc一块内存,如果内存不够的话,那就再申请一块。实际上这个函数使用的是new申请一块空间,所以这应该使用delete删除,但是我们现在还没学所以就没释放空间。
2.临时文件
临时文件要解决的问题1.如何不冲突 2.及时销毁
如果不及时销毁那么造成冲突的概率会更大。
char *tmp(char *s);创建一个名字给临时文件。返回值是名字。
这个函数是有危险的。因为并发,AB两个进程,A进程创建了一个名字还没有执行fopen,B进程开始执行创建名字函数执行完毕,也是还没执行fopen,此时轮到A进程执行,A进程开始创建文件并打开,B进程然后也开始打开文件,打开的是同一个文件,这是B进程会对A进程所写内容进行覆盖,由于是新文件所以不必要求新文件必须存在。原因是tmpnam创建一个临时文件需要两步产生名字,fopen,不能合成一步。
tmpfile FILE* tmpfile(void);创建一个匿名临时文件,已经在磁盘上产生,但是并不能在ls命令下查看。因为我们不关心文件名,只需要拿到FILE类型指针。
一个文件如果没有一个硬连接指向它而且文件的打开计数已经为0,那么这块数据就被释放了。
当你创建一个匿名临时文件,但是当你没有close,那么就在这个程序正常终止的时候释放这个进程所占的所有空间,临时文件也被销毁了。