C语言文件操作(FILE)与常用文件操作函数(5)

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

C语言文件操作(FILE)与常用文件操作函数

C语言文件操作(FILE)与常用文件操作函数

C语言文件操作(FILE)与常用文件操作函数

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(内存首地址, 数据块大小, 数据块个数, 文件指针);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2078301fb42c8c2b0f1fd154645abc7d.html