顺序读写文件

按单个字符读写

fgetc() getc()

fputc putc

按行读写

fgets() fputs()

按格式读写

fscanf() fprintf()

随机读写文件

fseek()函数 ftell()

操作文件游标到文件开始

fseek()函数可以完成功能 fseek(fp,0,SEEK_SET); 作为非常懒的C程序员于是发明了一个新的函数 rewind(fp); 就可以了。

文件缓冲区

标准I/O库提供缓冲的目的是尽可能地减少使用read和write的次数。他也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。标准I/O提供了三种类型的缓冲:

1、全缓冲。

全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作;注意,对于驻留在磁盘上的文件来说通常是由标准IO库实施全缓冲。

值得引起注意的是在UNIX环境 中,flush有两种意思。在标准I/O库方面,flush意味着将缓冲区中的内容写到磁盘上。在终端驱动程序方面flush表示丢弃已存储在缓冲区中的数据。

2、行缓冲。

标准IO在输入和输出中遇到换行符时执行IO操作;注意,Linux下标准输出默认是行缓冲,涉及终端的时候通常是行缓冲。

3、不带缓冲。

标准I/O库不对字符进行缓冲存储。例如,如果用I/O函数fputs写15个字符到不带缓冲的流中,则该函数很可能用write系统调用函数将这些字符立即写至相关联的打开文件中。标准出错流stderr通常是不带缓冲的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个换行符。

另外 C语言提供了一个叫setbuf()函数可以用以设置缓冲类型。

文件啥时候结束

EOF

End Of File,EOF 表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。 如果在读取文件的返回EOF表示文件无更多的数据可读取,即文件结束。

It is a macro definition of type int that expands into a negative integral constant expression (generally, -1).

It is used as the value returned by several functions in header to indicate that the End-of-File has been reached or to signal some other failure conditions.

It is also used as the value to represent an invalid character. 可被用于 表示无效字符。

通常EOF在stdio.h头文件定义为:

  #define EOF (-1)

比如打印当前目录下的main.c中的所有内容

  char c;
  while ((c = fgetc(fp)) != EOF)
{
    putchar (c);
  }

值得注意的是EOF并不是文件数据的最后一个字符数据。

feof

C语言中,当把数据以二进制形式存放到文件中时,就会有-1值的出现,此时不能采用EOF作为二进制文件的结束标志。为解决这个问题,ANSI C提供一个feof函数,用来判断文件是否结束。

如果遇到文件结束,函数feof(fp)的值为1,否则为0.feof函数既可用以判断二进制文件是否结束,也可以用以判断文本文件是否结束。

Check end-of-file indicator Checks whether the end-of-File indicator associated with stream is set, returning a value different from zero if it is.

This indicator is generally set by a previous operation on the stream that attempted to read at or past the end-of-file.

Notice that stream's internal position indicator may point to the end-of-file for the next operation, but still, the end-of-file indicator may not be set until an operation attempts to read at that point.

This indicator is cleared by a call to clearerr, rewind, fseek, fsetpos or freopen. Although if the position indicator is not repositioned by such a call, the next i/o operation is likely to set the indicator again.

一般在读取文件的场景中,一般都是以下的使用流程:

1、先读取文件
2、判断feof函数返回值;如果为0继续,否则执行第5步
3、将读取到的数据进行处理
4、继续第1步
5、结束

fgets

案例

  1. 实现一个cp命令 复制指定文本文件

  2. 对文件进行简单的加密

  3. fgets、fputs实现加密

  4. 超大文件排序

  5. 解析文件内容并且追加。计算文件中的算术表达式并且追加结果。

  6. 实现对二进制文件的拷贝。

  7. 实现对二进制文件的高效拷贝。

  8. 文件结合结构体。对教师数据的增删改查。

fflush

fclose函数隐含包含了一次fflush操作,把缓冲区内的数据刷新到输出设备

如果向文件中写入数据之后会 没有调用fclose()函数 请问会发生情况呢?