打开文件
FILE * fopen ( const char * filename, const char * mode );
参数1 路径/文件名
参数2 文件的打开模式 r -read 表示读 w -write 表示写 b -binary表示二进制方式 a -append表示追加
"r" 表示只读 "rb" 表示以二进制方式只读 "r+" "rb+"
"w" "wb" "w+" "wb+"
返回值
文 件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。
如果你不小心写成这样
FILE *fp = ("test.txt","r");
if(fp == NULL)
{
fprintf(stderr,"file not found");
return -1;
}
如果这样写会出什么错误,有什么危害?
预定义的标准流
属于C标准库预定义的三个标准文件流
#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
标准输入 stdin、 标准输出 stdout、 标准错误 stderr
定义形式
Linux中的
/* Standard streams. */
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
/* C89/C99 say they're macros. Make them happy. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
VS中
#define stdin (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))
执行一个shell命令 创建一个Linux进程时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件默认都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
C库提供的标准I/O函数,这些函数操作的是文件描述符,是标准输入流、输出流或者错误流,而不是键盘的设备文件<一种标准输入设备>和显示器的设备文件<一种标准输出设备>。如果改变了标准输出流和显示器设备文件之间的对应关系,那么可能结果就不会在显示器上。这种情况出现在命令行中使用重定向符号的时候,标准输入、标准输出和标准错误对应的就不是键盘设备文件和显示器设备文件,而是指定的某个普通的文件。
在默认情况下,stdout是行缓冲的,他的输出会放在输出缓冲区里面,只有到换行和缓冲满的时候,才会输出到输出设备中。而stderr是无缓冲的,会直接输出到输出设备中。
标准流在调用 exit(3) 和程序正常中止时被关闭。
关闭文件
fclose()函数原型
int fclose ( FILE * stream );
函数功能 关闭stream所标识的(打开的)文件。
自己打开的文件含着泪也要关闭
为什么?

一个进程所能打开的文件句柄数量是有限制的,如果只打开不关闭只会导致该进程后面可以打开的文件数量越来越少,这是 文件句柄资源泄露。
