fgets()用其第二个参数size来说明输入缓冲区的大小,使读入的字符数不能超过限定缓冲区的大小,从而达到防止缓冲区溢出攻击的目的,
假如已定义一个有32字节的缓冲区buffer[32],那么在下面两条读字符串的语句中,后者的安全性更高
gets(buffer);
fgets(buffer,sizeof(buffer),stdin);//安全性更高
虽然系统隐含的I/O是指终端设备,但其实标准输入和标准输出是可以重新定向的,操作系统可以重新定向它们到其他文件或具有文件属性的设备,只有标准错误输出不能进行一般的输出重定向,
例如,在没有显示器的主机上,把标准输出定向到打印机,各种程序不用做任何改变,输出内容就自动从打印机输出
这里用“<”表示输入重定向,用“>”表示输出重定向,例如:假设exefile时可执行程序文件名,执行该程序时,需要输入数据,现在如果要从文件file.in中读取数据,而非键盘输入,
那么在DOS命令提示符下,只要键入如下命令行即可
C:\exefile<file.in
于是exefile的标准输入就被“<”重定向到了file.in,c此时程序exefile只会专心致志地从文件file.in中读取数据,而不再理会你此后按下的任何一个按键,
再如,若键入如下命令行
C:\exefile>file.out
于是,exefile的标准输出就被“>”重定向到了文件file.out中,此时程序exefile的所有输出内容都被输出到了文件file.out中,而屏幕上没有任何显示
例:
1 #include <stdio.h> 2 3 main() 4 { 5 int c; 6 7 scanf_s("%d", &c); 8 printf("%d", c); 9 10 return 0; 11 }
将exe文件移到E盘,新建一个te.txt输入10然后保存,打开DOS命令行,转到E盘,输入test1.exe<te.txt回车,则te.txt文件中的10作为输入值,输出值为10
5、文件操作补充
因为在Microsoft Visual C++ 2010 Express中使用fopen,fscanf等函数编译器会显示警告,
This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
所有在文件操作时将改用fopen_s、fscanf_s等函数
fopen_s()函数
函数原型:errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
pFile----文件指针将接收到打开文件指针指向的指针
infilename----文件名
mode----允许访问的类型
fopen_s()打开文件成功返回0值,否则返回非0值
须定义另外一个变量errno_t err
例:
1 FILE *fp; 2 errno_t err; 3 err = fopen(&fp,"E:\\ww.txt","r");
这里的errno_t是int的别名,在编译器crtdef.h头文件中有typedef int errno_t;
fopen()与fopen_s()的区别
fopen_s()函数比fopen()函数多了一个溢出检测,安全性上有所提升,在使用形式上fopen_s()比fopen()多使用了一个参数,
需要特别注意的是:
fopen的返回值是FILE *,返回的是指向结构体类型的指针
而fopen_s的返回值是errno_t,返回的是errno_t(int)类型的数值
例:fopen()函数
1 fp = fopen("E:\\ww.txt", "r");
fopen_s()函数
1 errno_t err; 2 err = fopen_s(&fp,"E:\\ww.txt","r");
fscanf_s()函数
函数原型:fscanf_s(_Inout_ FILE * _File, _In_z_ _Scanf_s_format_string_ const char * _Format, ...);
fscanf_s和fscanf的区别
在使用形式上fopen_s()比fopen()多使用了一个参数,第四个参数是字节数(注意长度(strlen)和字节数(sizeof)的区别)
例:fscanf()函数
1 fscanf(fp, "%c", &c);
fscanf_s()函数
1 fscanf_s(fp, "%c", &c,sizeof(char));
6、上述文件操作函数代码示例(前提条件:在E盘根目录下新建一个txt文档命名为ww.txt,内容输入about保存)
fopen()函数----fopen(文件路径, 文件使用方式);
1 FILE *fp; 2 fp = fopen("E:\\ww.txt", "r");
fopen_s()函数----fopen_s(指向该文件指针的指针, 文件路径, 文件使用方式);
1 errno_t err; 2 err = fopen_s(&fp, "E:\\ww.txt", "r");
fread()函数----fread(内存首地址, 数据块大小, 数据块个数, 文件指针);
1 char ss[20]; 2 fread(ss, sizeof(char), 4, fp);
fwrite()函数----fwrite(内存首地址, 数据块大小, 数据块个数, 文件指针);