学习笔记:C文件操作

文件流

标准输入流、标准输出流、标准错误流

  1. 标准输入流:指向终端输入(一般为键盘,可重定向)。该流能够使程序读取来自终端输入的数据。
    指针:stdin
  2. 标准输出流:指向终端输出(一般为显示器,可重定向)。该流能够使程序把数据打印到终端输出上。
    指针:stdout
  3. 标准错误流:指向终端标准错误输出(一般为显示器)。
    指针:stderr

输入输出重定向

将标准输入设备重定向到data1.txt文件,标准输出设备重定向到data2.txt文件:
CMD test <data1.txt >data2.txt

文件的打开与关闭

缓冲文件系统

系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区

int fflush(FILE *fPtr);

  • 清理一个文件的缓冲区。
  • 参数fPtr是打开文件时由fopen()函数返回的FILE指针。
  • 对于以写方式打开的文件,函数将缓冲区中的数据写入磁盘文件。
  • 对于以读方式打开的文件,函数将缓冲区清空。

int flushall(void);

  • 用于清理所有文件的缓冲区。
  • 返回打开着的文件个数。

FILE类型

C系统为了处理文件,给每个打开的文件都在内存中开辟一片区域,用于存放文件的有关信息
FILE类型由系统定义(见<stdio.h>
用法:FILE * fPtr; 用fPtr指向要操作的文件

对文件的操作

打开文件->读或写文件->关闭文件

Ⅰ.文件的打开

fopen()函数
打开以filename所指向的字符串为文件名的文件,使之与一个流关联。返回一个指向FILE类型结构变量的指针
fPtr = fopen (“clients.dat”,“w”); //文件和程序在同一目录
fPtr = fopen (“C:\\temp\\clients.dat”,“w”); //文件绝对路径。

打开文件的操作方式
  • r:打开一个文本文件,可以读取文件
  • w:打开一个文本文件,可以写入文件(但会先删除文件原内容)。如果文件不存在,则创建。
  • a:打开一个文本文件,可以写入文件,向已有文件的尾部追加内容,如果该文件不存在则创建之
  • rb/wb/ab:对二进制文件的操作。r、w、a的含义同ASCII文件操作

Ⅱ.文件的关闭

fcolse()函数
fclose(fPtr); //关闭fPtr所指向的文件

文件指针

文件中有一个“文件位置指针”,指向下一次读写操作所在字节的整数值。每次读写1个(或1组)数据后,系统自动将文件位置指针移动到下一个读写位置上
打开文件时位置指针的起始位置与打开文件的方式有关

rewind():文件位置指针指向文件头

fseek():修改文件位置指针使其指向任一字节处

  • 将指定文件的位置指针,从参照点开始,移动指定的字节数(位移量)
  • 参照点:
    SEEK_SET ── 值为0,表示文件头
    SEEK_CUR ── 值为1,表示当前位置
    SEEK_END ── 值为2,表示文件尾
  • 位移量:以参照点为起点,向文件尾方向(位移量>0)或文件头方向(位移量<0)移动的字节数

ftell():返回文件当前位置的函数

文件读取

判断文件是否读到文件尾

在对ASCII码文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF(其值在头文件stdio.h中被定义为-1)

库函数feof()
int feof(FILE *stream);
在执行读文件操作时,如果遇到文件尾,则函数返回逻辑真(1);否则,则返回逻辑假(0)。feof()函数同时适用于ASCII码文件和二进制文件
!feof(fPtr)表示源文件(用于输入)未结束,循环继续

Ⅰ.读/写文件中的一个字符(文本文件)

fputc() 将一个字符写入指定文件
int fputc(int c, FILE *stream);
将c所指定字符写入stream所指向的输出流中
fputc(c,stdout)等价于putchar(c),将变量c输出到标准输出设备上

fgetc() 从指定文件读取一个字符
从stream所指向的输入流中获取下一个unsigned char类型的字符,并转换成int类型,同时将文件位置指针向前移动1个字节
ch=fgetc(stdin)等价于ch=getchar(),从标准输入流中读取一个字符

Ⅱ.读/写一个字符串(文本文件)

fputs() 向文本文件输出一个字符串
int fputs(const char *s,FILE * stream);
将s所指向的字符串写入stream所指向的流中(‘\0’不被写入)。同时将文件位置指针向前移动字符串长度个字节,指向下一写入位置
fputs(s, stdout)等价于puts(s),将s所指向的字符串写入到标准输出流

fgets() 从文本文件读一个字符串
char * fgets(char * s,int n,FILE * stream);
从stream指向的流中读取最多n-1个字符并放到s所指向的数组中,遇到下面情况不再往后读:

  1. 读到新行符‘\n’或者文件结束符(新行符会被读入到s)
  2. 或虽未遇新行符和文件结束符、但已读入n-1个字符。

最后一个字符读入数组后接着写入结束标志'\0' ,并将文件位置指针向前移动n-1(字符串长度)个字节

Ⅲ.对文件进行格式化读/写(文本文件)

int fscanf(FILE * stream,const char * format,输入变量首地址表);
fscanf(stdin,"%d",&input);

int fprintf(FILE * stream,const char * format ,输出参量表);

Ⅳ.读/写一个数据块(二进制文件)

int fread(void *buffer,int size,int count,FILE * stream);
stream所指向的流中读取数据到buffer所指向的数组中,size表示单个数组元素的大小,最多读取count个数组元素,流的文件位置指针根据成功写入的字节数递增。函数返回成功读入的元素个数。

int fwrite(void *buffer,int size,int count,FILE * stream);
buffer所指向的数组的内容写入stream所指向的流中。size表示单个数组元素的大小,最多写入count个数组元素。流的文件位置指针根据成功写入的字节数递增。函数返回成功写入的元素个数。