标准IO,fopen,fclose

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,这怎么区分数据和0xffEOF呢?
故设定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);




你可能感兴趣的:(Linux入门)