目录
1.读写单个字符(fgetc和getc、fputc和putc)
一、打开和关闭文件
1.文件
计算机文件(或称文件、电脑档案、档亲),是存储在某种长期储存设备或临时存储设备中的一段数据流,并且归属于计算机文件系统管理之下。所谓“长期储存设备”一般指磁盘、光盘、磁带等。而“短期存储设备”一般指计算机内存。需要注意的是,存储于长期存储设备的文件不一定是长期存储的,有些也可能是程序或条统运行中产生的临时数据,并于程序或系统退出后删除。
2.文本文件和二进制文件
C语言的文件主要有两种,一种是咱们看得懂的,一种是看不懂的。看得懂的是文本文件,由一些字符的序到组成的;另一种是二进制文件,通常是指除了文本文件以外的文件。
3.打开和关闭文件
- 只有在一个文件被打开的时候,才能够对其进行读写操作。
- “读”就是从文件里获取数据,“写”则相反,是将数据写入到文件里面。
- 在完成对一个文件的读写操作之后,必须将其关闭。
二、读写模式
1.读写单个字符(fgetc和getc、fputc和putc)
(1)fgetc和getc
- fgetc函数用于从文件流中读取下一个字符并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。
- 参数stream:该参数是一个FILE对象的指针,指定一个待读取的文件流
- 返回值:① 该函数将读取到的 unsigned char 类型转换为 int 类型并返回;② 如果文件结束或者遇到错误则返回EOF。
备注:
- fgetc函数和getc幽数两个的功能和描述基本上是一模一样的,它们的区别主要在于实现上:fgetc是一个幽数;而getc则是一个宏的实现;
- 一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快;
- 由于getc是由宏实现的,对其参数可能有不止一次的调用,所以不能使用带有副作用(side effects)的参数。
(2)fputc和putc
- fputc函数用于将一个字符写入到指定的文件中并推进文件的位置指示器(用来指示接下来要读写的下一个李符的位置)。
- 参数:①c:指定待写入的字符;②stream:该参数是一个FILE对象的指针,指定一个待写入的文件流。
- 返回值:① 如果函数没有错误,返回值是写入的字符;② 如果函数发生错误,返回值是EOF。
备注:
- fputc函数和putc函数两个的功能和描述基本上是一模一样的,它们的区别主要在于实现上:fputc是一个函数;而putc则是一个宏的实现;
- 一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快;
- 由于putc是由宏实现的,对其参数可能有不止一次的调用,所以不能使用带有副作用(side effects)的参数。
2.读写整个字符串(fgets和fputs)
(1)fgets
- fgets函数用于从指定文件中读取字符串。
- fgets函数最多可以读取 size - 1 个字符,因为结尾处会自动添加一个字符串结束符'\n',当读取到换行符('\n')或文件结束符(EOF)时,表示结束读取('\n'会被作为一个合法的字符读取)。
- 参数:① s:字符型指针,指向用于存放读取字符串的位置;② size:指定读取的字符致(包括最后自动添加的'\n');③ stream:该参数是一个FILE对象的指针,指定一个待操作的数据流。
- 返回值:① 如果函数调用成功,返回s参数指向的地址;② 如果在读取字符的过程中遇到EOF,则eof 指示器被设置;如果还没读入任何字符就遇到这种EOF,则s参数指向的位置保持原来的内容,函数返回NULL;③ 如果在读取的过程中发生错误,则error 指示器被设置,函数返回NULL,但s参数指向的内容可能被改变。
(2)fputs
- fputs函数用于将一个字符串写入到指定的文件中,表示字符串结尾的'\n'不会被一并写入。
- 参数:① s:字符型指针,指向用于存放待写入字符串的位置;② stream:该参数是一个FILE对象的指针,指定一个待操作的数据流。
- 返回值:① 如果函数调用成功,返回一个非0值;② 如果函数调用失败,返回EOF。
3.格式化读写文件(fscanf和fprintf)
- fscanf函数 用于从指定文件中读取格式化字符串。
- fprintf 函数用于打印格式化字符串到指定的文件。
4.二进制读写文件(fread和fwrite)
(1)fread
- fread函数用于从指定的文件中读取指定尺寸的数据。
- 参数:① ptr:指向存放数据的内存块指针,该内存块的尺寸最小应该是size*nmemb个字节;② size:指定要读取的每个元素的尺寸,最终尺寸等于size*nmemb;③ nmemb:指定要读取的元素个数,最终尺寸等于size*nmemb;④ stream:该参数是一个FILE对象的指针,指定一个待读取的文件流。
- 返回值:① 返回值是实际读取到的元素个数(nmemb);② 如果返回值比nmemb参数的值小,表示可能读取到文件末尾或者有错误发生(可以使用 feof 函数或ferror 函数进一步判断)。
(2)fwrite
- fwrite函数用于将指定尺寸的数据写入到指定的文件中。
- 参数:① ptr:指向存放数据的内存块指针,该内存块的尺寸最小应该是size*nmemb个字节;② size:指定要写入的每个元素的尺寸,最终尺寸等于size*nmemb;③ nmemb:指定要写入的元素个数,最终尺寸等于size*nmemb;④ stream:该参数是一个FILE对象的指针,指定一个待写入的文件流。
- 返回值:① 返回值是实际写入到的元素个数(nmemb);② 如果返回值与nmemb参数的值不同,则有错误发生。
三、随机读写文件(fseek)
- fseek函数用于设置文件流的位置指示器。
- 参数如下表:
- 返回值:① 如果该函数调用成功,返回值是0;② 如果该函数调用失败,返回一个非0值。
四、可移植性问题
-
对于以二进制模式打开的文件,fseek函数在某些操作系统可能不支持SEEK_END位置。
-
对于以文本模式打开的文件,fseek函数的whence参数只能取SEEK_SET才是有意义的,并且传递给offset参数的值要么是0,要么是上一次对同个文件调用ftell函数获得的返回值。