1.定义
  标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标
准函数包和stdio.h头中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度执行IO等。标准的IO提供了三种类型的缓存。
全缓存:当填满标准IO缓存后才进行实际的IO操作。
行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作。
不带缓存:stderr就是了。

集合特点:
    数据不重复
  无序

创建集合有两种方法
    第一种: 
    s = {1,2,3,4}
    第二种:
    s = set(['1','2','3','4'])

添加数据
    l.add # 添加单个数据
    l.update([1,3,3,4,5,6,7]) # 可以添加多数据
删除数据
    l.pop() # 随机删除
    l.remove # 按值删除,若没有则会报错
    l.discard # 按值删除,没有也不会报错
    l.clear() # 清空数据

集合关系测试
    交集
        l1.intersection # 第一种方法
        l1 & l2 # 第二种方法

        l1.intersection_update # 将交集赋给l1
    差集
        l1.difference # 第一种方法
        l1 - l2 # 第二种方法

        l1.difference_update # 将差集赋给l1
    并集
        l1.union # 第一种方法
        l1 | l2 # 第二种方法
    对称差集
        l1.symmetric_difference # 第一种方法
        l1 ^ l2 # 第二种方法
         - (l1 & l2) # 第三种方法
    包含关系
        子集
            l1.issubset # 判断l1是不是l2的子集(就是判断l1是否被l2包含)
            l1 <= l2
        超集
            l1.issuperset # 判断l1是不是l2的超集(就是判断l1是否包含l2)
            l1 >= l2
        in,not in : 判断某元素是否在集合内
        == ,!=  : 判断两个集合是否相等
        l1.isdisjoint : 判断集合是否不相交,相交返回 False,不相交返回 True

最近有一个功能是反馈统计,然后在反馈建议里面添加是从哪个页面点击过来的,一开始打算做成&url=这种方法加在链接里面然后页面接受参数,后来知道了request.UrlReferrer
知道他可以直接获取方便的很,然后就直接在model添加里面用了model.url=Request.UrlReferrer.tostring();后来我发现存到数据库里面的一直都是当前页面的url,一直想不明白是哪里有问题,然后上网查资料才发现,这个属性是必须在页面加载的时候才能获取到上一个页面的url,也就是在我
actionresult add()
添加页面的action里面才有效果,而在添加model的方法里面其实就取的是当前页面的url了。

  文件IO:文件IO称之为不带缓存的IO(unbuffered
I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于*nix平台。
2.区别
  首先:两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含文件和缓冲区相关数据的数据结构。低级I/O一般没有采用缓冲,需要自己创建缓冲区,不过其实在*nix系统中,都是有使用称为内核缓冲的技术用于提高效率,读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制。使用标准IO就不需要自己维护缓冲区了,标准IO库会根据stdin/stdout来选择缓冲类型,也就是说当你使用标准IO的时候,要清楚它的stdin/stdou是什么类型以及其默认的缓冲模式,如果不合适,你需要用setvbuf先设置,再使用,例如协同进程的标准输入和输出的类型都是管道,所以其默认的缓冲类型是全缓冲的,如果要使用标准IO,就需要现设置行缓冲。对于文件IO,只要你自己能维护好缓冲区,完全可以不用标准IO。
  其次从名字上来区分,文件I/O主要针对文件操作,读写硬盘等,标准I/O,主要是打印输出到屏幕等。因为他们设备不一样,文件io针对的是文件,标准io是对控制台,操作的是字符流。对于不同设备得特性不一样,必须有不同api访问才最高效。
  最后来看下它们使用的函数 
  图片 1

所以我是这样用的

1.fopen与open
  标准I/O使用fopen函数打开一个文件:  FILE* fp=fopen(const char*
path,const char *mode)
  其中path是文件名,mode用于指定文件打开的模式的字符串,比如”r”,”w”,”w+”,”a”等等,可以加上字母b用以指定以二进制模式打开(对于
*nix系统,只有一种文件类型,因此没有区别),如果成功打开,返回一个FILE文件指针,如果失败返回NULL,这里的文件指针并不是指向实际的文
件,而是一个关于文件信息的数据包,其中包括文件使用的缓冲区信息。
  *nix系统使用open函数用于打开一个文件:int fd=open(char *name,int
how);
  与fopen类似,name表示文件名字符串,而how指定打开的模式:O_RDONLY,O_WRONLY,O_RDWR
,还有其他模式请man 2
open。成功返回一个正整数称为文件描述符,这与标准I/O显著不同,失败的话返回-1,与标准I/O返回NULL也是不同的。

 //添加意见        public ActionResult Add()        {            if (Request.UrlReferrer!=null)            {                //页面加载的时候获取上一次访问的url                ViewBag.urllast = Request.UrlReferrer.AbsoluteUri;            }            return View();        }

2.fclose与close
  与打开文件相对的,标准I/O使用fclose关闭文件,将文件指针传入即可,如果成功关闭,返回0,否则返回EOF
  比如:
  if(fclose
  printf(“Error in closing file”);

然后在添加model的时候将viewbag中的url传过来就ok了

发表评论

电子邮件地址不会被公开。 必填项已用*标注