getline

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,那么就在这个程序正常终止的时候释放这个进程所占的所有空间,临时文件也被销毁了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值