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 截图

原文地址:https://www.cnblogs.com/lanjianhappy/p/7193464.html