fopen打开文件的权限如下:
r只读,文件必须存在
r+读写,文件必须存在
w只写,文件不存在就创建,文件存在就清空文件
w+读写,文件不存在就创建,文件存在就清空文件
a只写,文件不存在就创建,文件存在就在文件后面追加
a+读写,文件不存在就创建,文件存在就在文件后面追加
1、修改默认的权限掩码:
fopen ()没有设定创建文件权限的参数,通过fopen创建的文件的权限是通过0666 &(~umask)得到的。其中umask称为文件权限掩码可以通过以下方式修改
临时修改:在终端输入umask 0222 即可修改为0222 永久修改: /etc/profile 文件中写入一个新的 Umask 值。 |
2、标准IO的核心对象是流
流的缓冲类型分为三种:
全缓存:用fopen打开的文件
结束条件:写满,当进程退出,用fflush强制刷新,关闭当前文件
全缓冲的大小为4096个字节,可以通过setvbuf()设置
行缓存:标准输入流stdin和标准输出流stdout
结束条件:写满,当进程退出,用fflush强制刷新,关闭当前文件
当遇到结束字符'\n'
行缓冲的默认大小为1024,可通过setbuf()设置
无缓存:标准输出错误流stderr
对流的读写时立即执行。
3、流的打开、判断有没有打开、以及错误信息的处理
用到三个函数:
关 一档 两档 三档
FILE fopen(const char *path, const char *mode);
int fclose(FILE *stream);
perror(const char*s);
例:
void main()
{
FILE *fp =NULL;
if((fp = fopen("filename","mode")) == NULL){
perror("fail to open");
exit(-1);
}
fclose(fp);
}
通常一个进程开始运行时,默认会打开三个流:
stdin stdout , stderr
一个进程最多可以打开1024个流
每一个流都对应一个描述符,这三个标准输入、输出、错误所对应的描述符分别为0,1,2
4、流的读写
(1)按照字符输入输出
int getc(FILE *stream)
int fgetc(FILE *stream)
int getchar()
int putc(int c, FILE *stream)
int fputc(int c,FILE *stream)
int putchar(int c)
成功: 返回读取的字符
失败: 返回EOF
返回值为int型:
fgetc从文件里读一个字节的数据,如果设定为unsigned char 型的,那么读到0xff的时候返回的是0xff;而如果fgetc的返回值类型设定也是unsigned char, 那读到文件尾部EOF返回值为-1的计算机存储也是0xff,这怎么区分数据和0xff和EOF呢?
故设定fgetc 的返回值为int型,那么EOF可以表示为0xffff ffff,而读回的0xff数据的int值为0x0000 00ff,这样就区分开了。
(2)按照行的读写
char fgets(char *s, int size, FILE *stream);
会从终端读出换行符,这个问题在编写使用标准IO的函数,在一个文件中插入一行的程序struct_fseek.c中遇到,以后用的时候要注意!
从一个流中读取一个字符串,遇到'\n'停止读取,每次最大读取size-1个字节,所以fgets()函数并不能保证每次都能读出一行
同样fputs()函数在输出的时候,不会再最后添加'\n',所以如果获取到的字符串没有换行符,fputs()函数可能会出现问题。
(3)指定大小为单位读写文件
size_t fread(void* ptr, size_t size, size_t nmenb, FILE *stream);
size_t write(const void* ptr, size_t size, size_t nmenb, FILE *stream);
fread:从stream中读取nmenb个大小为size字节的数据放到ptr开头的缓冲区中。
fwrite: 把ptr开头的缓冲区中的数据的nmenb个大小为size字节的数据写入stream流中。
返回值为读取或写入多少块
5、流的定位:
int fseek(FILE *stream, long offset, int whence)
whencd :SEEK_SET SEEK_END SEEK_CUR
long ftell(FILE *steam)获取当前光标所在位置
void rewind()光标放回到开头
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);