文件IO操作相关系统编程(2)

函数
 mode
 buf
 缓冲区长度
 缓冲类型
 
setbuf
  非空
 长度为BUFSIZ的BUF
 全缓冲,行缓冲
 
NULL
 无缓冲区
 不带缓冲
 
setvbuf
 IOFBF
 非空
 长度为size的buf
 全缓冲
 
NULL
 合适长度的系统缓冲区
 
IOLBF
 非空
 长度为size的buf
 行缓冲
 
NULL
 合适长度的系统缓冲区
 
IONBF
  无缓冲区
 不带缓冲

#include <stdio.h>
#include <stddef.h>
#include <string.h>
int main() {
    FILE * iostream = fopen("fopenfile", "w+");
    if (iostream == NULL) {
        perror("流打開錯誤");
        return -1;
    }
    setvbuf(iostream, NULL, _IOFBF, BUFSIZ); //1
    char *buf = "abcde"; //2
    int size = fwrite(buf, sizeof(char), strlen(buf)+1 ,iostream);
    printf("寫入的數據是:%s", buf);
    fflush(iostream); //3
    sleep(-1);
    return 1;
}

针对上述代码做如下分析:

将3处进行注释,并执行

fopenfile文件无任何内容,因此现在数据都在缓冲区,由于进程SLEEP流未关闭,并且缓冲区也没有写满,因此不会执行IO操作

不注释任何内容,并执行

fopenfile文件内容为abcde,由于fflush冲洗将缓冲区数据写入文件

将1处缓冲模式改为_IOLBF,注释3处,并执行

fopenfile文件无任何内容,虽然指定了行缓冲但是没有行结束符,因此数据在缓冲区内,没有进行IO操作

将1处缓冲模式改为_IOLBF,注释3处,并将2处数据改为buf=”abcde\n” ,执行

fopenfile文件内容为abcde,由于设置行行缓冲,并且存在结束符,因此进行了IO操作

将1处缓冲模式改为_IONBF,注释3处,并执行

fopenfile文件内容为abcde,由于设置无缓冲,因此每次写入都会进行IO操作

主要函数

打开关闭流
打开一个指定的文件

FILE *fopen (constchar *__restrict __filename,

constchar *__restrict __modes)

通过文件描述符打开一个指定的文件

FILE *fdopen (int __fd, constchar *__modes)

modes:打开模式

R或rb
 为读而打开
 
W或wb
 把文件截断为0长,或为写而创建
 
A或ab
 添加;在文件尾为写而打开,或为写而创建
 
R+
 为读和写而打开
 
W+
 把文件截断为0长,或为为读和写而打开
 
A+
 为在文件尾为写而打开或创建

关闭文件流

intfclose (FILE *__stream);

单字符读写

读函数

int fgetc (FILE *__stream);

int getc (FILE *__stream);

int getchar (void);

fgetc是一个函数,getc可实现为宏,getchar为从标准输出流中获取一个字符,相当于getc(stdin)

返回值:若成功则返回读取到的字符,若失败或读到文件尾则返回-1

由于无论失败或者读到文件尾都返回-1,为了区分哪种原因返回的-1。提供下面2个函数

以读到文件结尾返回

int feof (FILE *__stream)

以产生错误返回返回

int ferror (FILE *__stream)

返回值:条件为真返回非0.条件为假返回0

写函数

int fputc(int __c, FILE *__stream);

int putc (int __c, FILE *__stream);

int putchar (int __c);

返回值:成功返回c,失败返回EOF

举例:

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

转载注明出处:http://www.heiqu.com/18996.html