zoukankan      html  css  js  c++  java
  • linux以行为单位进行读写操作

    1 gets/fgets函数

      char* fgets(char *restrict buf,int n,FILE *restrict fp)

        参数1:存放读入串的缓冲区

        参数2:表示读入的字符个数,最大值不能超过缓冲区的长度,遇到N为止,如果读到N-1个字符仍让没有读到' ' 那么只读入n-1个字符,最后一个字符用来放入'';

        注意:fgets会把' '也放入到缓冲中 所以实际上的字符为n-1个

      char* gets(char *buf)

        返回值:

          成功读入一行,返回缓冲区的首地址

          出错返回NULL

       gets和fgets类似,不将' '放入到缓冲区

       gets的漏洞:函数的缓冲区由用户提供,但是无法指定一次最多读入多少字节的内容,所以很危险

    1.1 演示gets的漏洞

    在ubuntu14.04 直接不让用gets() 警告危险

     1 #include <stdio.h>
     2 int main(void)
     3 {
     4     /* 这个缓冲区已经很大了,如果用户输入是在命令行方式下的话,该缓冲的空间是足够的 */
     5     char buf[2048]; 
     6     while(gets(buf) != NULL){ /* 从屏幕读入一行字符串 */
     7         printf("%s
    ", buf); /* 并且将该字符串显示输出到屏幕上 */
     8     }
     9     return 0;
    10 }

    注意:屏幕简单的输入和输出都不会出现问题 因为默认1024个字节 当一个比较大的时候 就会出现段错误

    2puts/fputs:向标准输出字符串

      注意:gets函数不读入' '但是puts会输出' '

    推荐使用fgets和fputs

    3 3按照行也读:通常配置文件都是需要这样来处理+正则表达式

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #define MAX_LINE 1024
     5 int main(void)
     6 {
     7     char buf[MAX_LINE]; /* 缓冲区 */
     8     FILE *fp;
     9     int len;
    10     if((fp = fopen("test.txt", "r")) == NULL){ /* 打开文件 */
    11         perror("fail to read");
    12         exit(1);
    13     }
    14     while(fgets(buf, MAX_LINE, fp) != NULL){ /* 每次读入一行 */
    15         len = strlen(buf);
    16         /* 输出所读到的字符画串,并将字符个数输出 */
    17         buf[len - 1]=''; /* 去掉换行符,这样其他的字符串函数就可以处理了 */
    18         printf("%s %d
    ", buf,len - 1); /* 使用printf函数输出 */
    19     }
    20     return 0;
    21 }

    3.1 截图

  • 相关阅读:
    tomcat常见错误及解决方案
    MySQL 5.6 for Windows 解压缩版配置安装
    win7 cmd 操作mysql数据库
    @Responsebody与@RequestBody
    ajax常用参数
    JSP和servlet有什么区别?
    面试 小总结
    cocoapods导入三方库头文件找不到问题
    git笔记
    iOS裁剪,缩放图片白边问题解决办法
  • 原文地址:https://www.cnblogs.com/lanjianhappy/p/7193464.html
Copyright © 2011-2022 走看看