顺序读写数据文件
文件打开之后,就可以对它进行读写了。在顺序写时,先写入的数据存放在文件中前面的位置,后写入的数据存放在文件中后面的位置。在顺序读时,先读文件中前面的数据,后读文件中后面的数据。即对顺序读写来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的。顺序读写需要用库函数实现。
读字符 fgetc(fp);写字符fput(ch,fp);
函数名 | 调用形式 | 功能 | 返回值 |
fgetc | fgetc(fp) | 从fp指向的文件读入一个字符 | 读成功,带回所读字符,失败则返回文件结束标志EOF(即-1) |
fputc | fputc(ch,fp) | 把字符ch写到文件指针变量fp所指向的文件中 | 输出成功,返回值就是输出的字符;输出失败,则返回EOF(即-1) |
//c系统中在stdio.h中把fgetc定义为getc #define getc(fp) fgetc(fp)
//c系统中在stdio.h中把fputc定义为putc #define putc(ch,fp) fputc(ch,fp)
检测文件读写位置标记feof(文件指针);
//检测文件读写位置标记是否移到文件末尾,即磁盘文件是否结束。
//若结束返回1(真),否则为0(假)。
读字符串fgets(str,n,fp);写字符串fputs(str,fp);
函数名 | 调用形式 | 功能 | 返回值 |
fgets | fgets(str,n,fp) | 从fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中。 | 读成功,返回地址str,失败返回NULL |
fputs | fputs(str,fp) | 把str所指向的字符串写到文件指针变量fp所指向的文件中。 | 输出成功,返回0;否则返回非0值 |
- fgets的函数原型 char* fgets(char *str,int n,FILE *fp);作用是从文件读入一个字符串。调用时可以写成fgets(str,n,fp);其中n是要求得到的字符个数,但实际上只从fp所指向的文件中读入n-1个字符,然后在最后加一个’\0’字符,这样得到的字符串共有n个字符,把它们放到字符数组str中。
如果在读完n-1个字符之前遇到换行符“\n”或文件结束符EOF,读入即结束,但将所遇到的换行符“\n”也作为一个字符读入。
若执行fgets函数成功,则返回值为str数组首元素的地址,如果一开始就遇到文件尾或读数据出错,则返回NULL。
- fputs的函数原型int fputs(char *str,FILE *fp);作用是将str所指向的字符串输出到fp所指向的文件中。调用时可以写成fputs(str,fp);。第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的“\0”不输出。若输出成功,函数值为0,失败时,函数值为EOF。
fgets和fputs功能类似于gets和puts,只是前者以文件为读写对象,后者以终端为读写对象。
为避免出现无法区分字符串的情况,输出一个字符串后,人为输出’\n’作为字符串间的分隔。
格式化读文件 fprintf(文件指针,格式字符串,输出表列);
将输出表列输出到文件指针指向的文件中,与输出到屏幕情况类似,只是输出的位置是文件
格式化写文件 fscanf(文件指针,格式字符串,输入表列);
从文件指针指向的位置读取,赋给输入表列
由于fprintf和fscanf,
用以上两个函数对磁盘文件读写,使用方便,容易理解,但由于要进行ASCII-二进制转换,因此在内存与磁盘需要频繁交换数据的情况下,最好不用这两个函数。
二进制读一组数据 fread(buffer,size,count,fp);
fread(buffer,size,count,fp);//从文件中读入一个数据块
二进制写一组数据 fwrite(buffer,size,count,fp);
fwrite(buffer,size,count,fp);//向文件写一个数据块
buffer:是一个地址。对fread来说,它是用来存放从文件读入的数据的存储区的地址。对fwrite来说,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址)。
size:要读写的字节数。
count:要读写多少个数据项(每个数据项长度为size)。
fp:FILE类型指针。
打开文件时指定用二进制文件,这样就可以用fread和fwrite函数读写任何类型的信息。
fread和fwrite为int型,执行成功,返回值为形参count的值(一个整数),即输入或输出数据项的个数。
fread和fwrite函数一般用于二进制文件的输入输出。因为它们是按数据块的长度来处理输入输出的,不出现字符转换。
若有字符转换,很可能出现与原设想的情况不同。如
fread(butter,size,count,stdin);//企图通过终端键盘输入数据
//stdin是指向标准输入流的指针变量,语法没错,但由于fread函数要求一次输入size个字节(而不问这些字节内容),因此输入的分隔符也会被当成数据,导致出错。
随机读写数据文件
随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行访问,访问效率高于顺序访问。