标准I/O(C库函数)

与操作系统独立,只能操作常规文件,有缓冲区
常规文件:ASCII码文件(文本文件)、二进制文件

缓冲区:减少用户和内核切换的次数,减小系统开销。当对文件进行操作时,缓冲区才会被开辟。当进程结束时自动调用fclose(),关闭已打开的文件,刷新缓冲区。

全缓冲:4k字节,用于标准文件操作,当缓冲区满的时候给内核。

行缓冲:1k字节,用于标准输入输出,当缓冲区遇到‘\n’时给内核。

不带缓冲:0字节,用于标准出错,数据不经过缓冲区,直接给内核。

内核中有高速缓存,定时刷新至硬盘。



描述     文件描述符int    文件描述符对应的宏   文件指针FILE*
标准输入        0            STDIN_FILENO         stdin
标准输出        1            STDOUT_FILENO        stdout
标准错误        2            STDERR_FILENO        stderr



int fflush(FILE *fp); 用于将缓冲区中的数据实时刷新至内核。

FILE *fopen(const char *path,const char *mode);
FILE *fdopen(int fd,const char *mode);   //联系流与文件描述符
FILE *freopen(const char *path,const char *mode,FILE *stream);  //用于重定向
int fclose(FILE *stream);
当一个进城正常终止时(直接调用exit函数,或从main函数返回),系统会自动调用fclose()函数,刷新所有缓冲区,所有打开的标准I/O流都被关闭。
为了编程规范,使用文件后,一定要显式的调用fclose()。

mode参数:
r或rb      打开只读文件,该文件必须存在。
r+或rb+    打开可读写的文件,该文件必须存在。
w或wb      打开只写文件,若文件存在则清空。若文件不存在则创建该文件。
w+或wb+    打开可读写文件,若文件存在则清空,若文件不存在则创建该文件。
a或ab      以附加方式打开只写文件,若不存在则创建,若文件存在,写入的数据追加到文件尾,即原先内容被保留。
a或ab+     以附加方式打开可读写文件,若不存在则创建,若文件存在,写入的数据追加到文件尾,即原先内容被保留。
b 表示以二进制方式打开文件。

二进制和文本模式的区别

1.在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。

2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。



每次一个字符的I/O:如果流是带缓冲的,标准I/O函数处理所有缓冲。
int fgetc(FILE *stream);  文件结尾或出错都返回EOF
while(!feof(fp)&&!ferror(fp))
{

ch = fgetc(fp);
    if(ch == EOF) break;
    printf("%c",ch);
}
int fputc(int c,FILE *stream);

int getc(FILE *stream);

int putc(FILE *stream);

实现为宏,从流中读或写。

int getchar(void); 从终端读 stdin

int putchar(int c); 输出到终端 stdout

实现为宏

检查文件出错函数

int feof(FILE *stream);

int ferror(FILE *stream);

int clearerr(FILE *stream);



每次一行的I/O:每行都以‘\n‘结束
char *fgets(char *s,int size,FILE *stream);已处文件尾端或出错返回NULL。
fgets一次只能从文件读取一行(一行最大1024个字节),在文本文件中,每行最后都是‘\n’,fgets会自动读取最后的换行符,所以打印时不需加‘\n‘。
当用fgets读取n个字节的数据时,只会返回n-1个字符,最后一个放‘\0’。
while(fgets(str,100,fp1) != NULL)
{
    fputs(str,fp2);
}
int fputs(const char *s,FILE *stream);

char *gets(char *s);int puts(const char *s);



直接I/O:用于读写块或结构体
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
从流stream中读取size*nmemb个字节到ptr开始的地址空间。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);



定位流:
int fseek(FILE *stream, long offset, int whence); 用于设定流的文件位置。offset为正向后偏移,为负向开头偏移。whence参数为 SEEK_SET(开头)/SEEK_CUR(当前)/SEEK_END(结束)。
long ftell(FILE *stream); 获取当前的文件位置。
void rewind(FILE *stream); 用于设定流的文件位置为文件开始。

时间: 2024-11-16 19:26:29

标准I/O(C库函数)的相关文章

标准c库函数与Linux下系统函数库 区别 (即带不带缓冲区的学习)

我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open().close().write().read()等,而标准C语言的库函数中也有一套对文件的操作函数fopen().fclose().fwrite().fread()等..那么同样是对文件的操作函数,标C与UC有什么区别呢?是标C效率高还是UC效率高呢?今天就让我们来一探究竟. 程序作用:将0~999999这1000000个整型数据写入文件. 1.标准C实现大量数据写入文件: /*文件名test1.c*

文件I/O与标准I/

一.先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用.也就是一般所说的低级I/O--操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台. 标准I/O:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性.标准I/O库处理很多细节.例如缓存分配,以优化长度执行I/O等.标准的I/O提

使用keil建立标准STM32工程模版

1.   模板工程的创建(超级详细版,使用的是keil 4.5版本) 1.1创建工程目录 良好的工程结构能让文件的管理更科学,让开发更容易更方便,希望大家养成良好的习惯,使用具有合理结构的工程目录,当你着手于较大的软件项目时,类别分明,层次合理的工程目录结构会让你的开发管理化繁为简. (1)首先在一个目录下创建主文件夹,名字按需求取,这里取名为:(0)工程模板 (2)在该文件夹里分别建立名字为Project和Source的文件夹.其中Project文件夹用来放置工程文件,而Source用来放置程

C语言1——基础

1.gcc指令 gcc -o a a.c  编译a.c文件,链接,生成名字为a的可执行文件 上面的指令完整一点应该写成gcc -o a.exe a.c,即生成a.exe可执行文件 但是在Windows系统下可执行文件的后缀是exe,但是在Linux系统下可执行文件的后缀是out 当然,在Linux下也可以写gcc -o a.exe a.c,不会有任何错误,但是会生成一个a.exe文件,从名字上来看不是很好 gcc -E -o a1.i a.c 预编译a.c文件,声称名字为a1的c源文件,因为预编

C语言回顾

1.C语言共32个关键字 1)数据类型关键字 a.基本数据类型 void char int float double b.类型修饰关键字 short long signed unsigned c.复杂类型关键字 struct union enum typeof sizeof d.存储级别关键字 auto static register寄存器类型  extern const volatile 2)流程控制关键字 a.跳转结构 return continue break goto b.分支结构 if

PHP 数据库操作类:ezSQL

EZSQL类介绍: 下载地址:http://www.jb51.net/codes/26393.html ezsql是一个小型的快速的数据库操作类,可以让你很容易地用PHP操作各种数据库( MySQL.oracle8/9 .interbase.FireBird.PostgreSQL.MS-SQL.sqlite.sqlite C++). 在你的脚本开头是要包含一个一个PHP文件.然后,你就可以使用更小.更容易的一套ezsql函数来代替标准的PHP数据库函数. 它会自动缓存的查询结果,提供了一系列简单

C++高质量编程笔记

/* * 函数介绍: * 输入参数: * 输出参数: * 返回值 : */ void Function(float x, float y, float z) { - } if (-) { - while (-) { - } // end of while - } // end of if 版权和版本的声明位于H和CPP的开头(参见示例 1-1),主要内容有: ( 1)版权信息. ( 2)文件名称,标识符,摘要. ( 3)当前版本号,作者/修改者,完成日期. ( 4)版本历史信息. 头文件里面的内

【Windows编程】系列第四篇:使用Unicode编程

上一篇我们学习了Windows编程的文本及字体输出,在以上几篇的实例中也出现了一些带有“TEXT”的Windows宏定义,有朋友留言想了解一些ANSI和Unicode编程方面的内容,本章就来了解和学习一些Windows下关于ANSI和Unicode方面的编程基础. 计算机最早在美国诞生,所以最开始都是以英语为作为交互语言,由于只有26个字母,用一个字节(范围-128 ~ 127)表示,这个范围足够表示26个因为字符和一些常用的控制字符,这个就是ASCII编码.因此最早的各种程序设计语言以及使用的

C文件IO

ANSI C标准几乎被所有的操作系统支持,ANSI C标准提供了完善的I/O函数,使用这些I/O操作我们可以控制程序的输入输出.读写系统磁盘文件.本文记录了用户进程I/O缓冲介绍.文件的读写.文件定位操作等内容. 库函数与系统调用 文件是位于磁盘上的,如何在运行的程序(进程)中控制文件的读写,通过下面的这张图,我们可以看到应用程序如何控制系统资源(包括磁盘中的文件)的大概的原理. 操作系统帮助我们管理硬件资源,封装底层实现,以接口的形式(系统调用函数)供上层应用程序调用.直接使用操作系统提供的系

Unicode简介

Unicode简介 壹佰软件开发小组  整理编译   在第一章中,我已经预告,C语言中在Microsoft Windows程序设计中扮演着重要角色的任何部分都会讲述到,您也许在传统文字模式程序设计中还尚未遇到过这些问题.宽字符集和Unicode差不多就是这样的问题. 简单地说,Unicode扩展自ASCII字符集.在严格的ASCII中,每个字符用7位表示,或者计算机上普遍使用的每字符有8位宽:而Unicode使用全16位字符集.这使得Unicode能够表示世界上所有的书写语言中可能用于计算机通讯