返回首页
EN
H7 / SECURITY RESEARCH NOTES

2022.2.19

缓冲区学习

# 定义
缓冲区填满之后,才进行输入输出操作。
# 举例
当我们将数据写入文件后,打开文件并不能立即看到内容,只有清空缓冲区(即将缓冲区中的数据“倒出”),或者关闭文件、关闭程序之后,才能在文件中看到内容。
  • 行缓冲
# 定义
在输入和输出过程中遇到换行符时,才进行输入和输出操作。
# 举例
标准输入设备(键盘)、标准输出设备(显示器)
  • 不带缓冲
# 定义
不带缓冲区,数据没有地方缓存,就立即进行输入输出。
  • 为了从根源消除缓冲区带来的各种奇怪的行为,这里提倡在输入输出之前先对缓冲区进行清空
# 参考链接
http://c.biancheng.net/view/vip_1799.html

scanf高级用法

# scanf()控制字符串完整写法总结:
%{*} {width} type
# 注:{}表示可选项
- type表示读取什么类型数据,比如%d,%c,%s,%[a-z],%[^\n]等,必须存在该选项
- width表示最大读取宽度,可有可无
- *表示丢弃读取到的数据,可有可无

字符串处理函数

  • c语言提供了丰富的字符串处理函数,可以对字符串进行输入、输出、合并、修改、比较、复制、转换、搜索等操作。

  • string.h的文档参考:http://www.cplusplus.com/reference/cstring/

预处理命令学习

  • 以#开头的命令,如#include、#define这样的命令称为预处理命令。

  • c语言:源程序 -> 预处理 -> 编译(编译为目标文件) -> 链接(将编译好的多个目标文件以及系统中的库、组件等合并为可执行程序)

  • c语言提供多种预处理功能:宏定义、文件包含、条件编译等等

  • #define叫做宏定义命令,所谓宏,就是用一个标识符来表示一个字符串,举例:#define N 100 => 这一段代码就是一段宏定义。

# 注意
用宏定义表示数据类型和用typedef定义数据说明符的区别:
宏定义只是简单的字符串替换,由预处理器来处理;
而typedef是在编译阶段由编译器处理,且它不是简单的字符串替换,而是给原有的数据类型起一个新的名字,是一种新的数据类型。

文件操作

  • 在c语言中,硬件设备可以看成文件,有些输入输出函数不需要你指明读写哪个文件,系统已经为他们设置了默认的文件,当然也可以修改,比如让printf()向磁盘上的文件输出数据。
  • 操作文件流程:打开文件 -> 读写文件 -> 关闭文件。
  • 文件流:磁盘上的文件要加载到内存中才能处理,而内存中的数据要写入磁盘文件中才不会丢失,所谓文件流,即数据在磁盘上的文件和内存之间传递的过程就叫做文件流,类似水从一个地方流到另一个地方。
  • 输入流:数据从磁盘文件流入到内存;输出流:即数据从内存流出到磁盘文件。
  • 当然除了磁盘文件(这里只是比喻,还有数据库、键盘、网络)
  • 所谓打开一个文件,即打开一个流。
# fopen()函数具体用法参考链接:
http://c.biancheng.net/view/2054.html
  • fopen()的文本方式和二进制方式打开区别在哪?
没有本质区别,只是对于换行符处理不同;
总结来说:
对于windows平台,最好用"t"来打开文本文件,然后用"b"来打开二进制文件。
而对于linux平台,无所谓。
  • 读写文件学习如下:
// 以字符形式读写文件涉及相关函数如下:
// 参考链接:http://c.biancheng.net/view/2068.html
int fgetc(FILE *fp);
int fputc(int ch, FILE *fp);

// 以字符串形式读写文件涉及相关函数如下:
// 参考链接:http://c.biancheng.net/view/2070.html
char *fgets(char *str, int n, FILE *fp);
int fputs(char *str, FILE *fp);

// 以数据块的形式读写文件涉及相关函数如下:
// 注意:在windows系统上,以数据块的形式读写文件时,需要将文件的打开方式指定为b,即以二进制方式打开文件。
// 参考链接:http://c.biancheng.net/view/2071.html
size_t fread(void *ptr, size_t size, size_t count, FILE *fp);
size_t fwrite(void *ptr, size_t size, size_t count, FILE *fp);

// 格式化读写文件涉及相关函数如下:
// 参考链接:http://c.biancheng.net/view/2073.html
int fscanf(FILE *fp, char *format, ...);
int fprintf(FILE *fp, char *format, ...);

// 随机读写文件设计函数如下:
// 参考链接:http://c.biancheng.net/view/2075.html
// 在实际开发过程中会涉及到读写文件的中间部分,要解决这个问题,首先得移动文件内部的位置指针,再进行读写。这种读写方式称为随机读写。
// 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。
void rewind(FILE *fp);
int fseek(FILE *fp, long offset, int origin);

想使用不安全的函数,怎么屏蔽visual studio的警告信息?

// 文件开头添加如下预处理语句即可:
#pragma warning(disable : 4996)

// 参考链接如下:
https://stackoverflow.com/questions/19321804/this-function-or-variable-may-be-unsafe-visual-studio/36521657