标准文件读写之FILE结构操作
头文件
#include <stdio.h>
文件的打开
fopen(char *filename,char *type);
文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。
FILE *fp;
if((fp=fopen("test","w"))==NULL) {
printf("File cannot be opened/n");
exit();
}
else
printf("File opened for writing/n");
……
fclose(fp);
文件的关闭
int fclose(FILE *stream);
文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。
if(fclose(fp)!=0) {
printf("File cannot be closed/n");
exit(1);
}
else
printf("File is now closed/n");
文件的读写
读写文件中字符
int fgetc(FILE *stream);
int getchar(void);
int fputc(int ch,FILE *stream);
int putchar(int ch);
int getc(FILE *stream);
int putc(int ch,FILE *stream);
在TC中,putc()等价于fputc(),getc()等价于fgetc()。putchar(c)相当于fputc(c, stdout);getchar()相当于fgetc(stdin)。
读写文件中字符串
char *fgets(char *string,int n,FILE *stream);
char *gets(char *s);
int fprintf(FILE *stream,char *format,variable-list);
int fputs(char *string,FILE *stream);
int fscanf(FILE *stream,char *format,variable-list);
fgets()函数将把由流指针指定的文件中n-1个字符,读到由指针string指向的字符数组中去,例如:fgets(buffer,9,fp); 将把fp指向的文件中的8个字符读到buffer内存区,buffer可以是定义的字符数组,也可以是动态分配的内存区。注意,fgets()函数读到’\n’就停止,而不管是否达到数目要求。同时在读取字符串的最后加上’\0’。 fgets()函数执行完以后,返回一个指向该串的指针。如果读到文件尾或出错,则均返回一个空指针NULL,所以要用feof()函数来测定是否到了文件尾或者是ferror()函数来测试是否出错。
#include "stdio.h"
int main() {
FILE *fp;
char str[128];
if((fp=fopen("test.txt","r"))==NULL) {
printf("cannot open file/n"); exit(1);
}
while(!feof(fp)) {
if(fgets(str,128,fp)!=NULL)
printf("%s",str);
}
fclose(fp);
}
以上为读取test.txt文件中的第一行并显示出来。
文件的随机读写
移动文件指针
fseek(FILE *stream,long offset,int origin);
fseek()函数用于把文件指针以origin为起点移动offset个字节,其中origin指出的位置可有以下几种:
origin数值为0代表文件开头,为1代表文件指针当前位置,为2代表文件尾。
例如:fseek(fp,10L,0);把文件指针从文件开头移到第10字节处,由于offset参数要求是长整型数,故其数后带L。
非标准文件的读写
这类函数最早用于UNIX操作系统,ANSI标准未定义,但有时也经常用到,DOS 3.0以上版本支持这些函数。它们的头文件为io.h。
文件的打开和关闭
int open(char *filename, int access);
int close(int handle);
open表示按access的要求打开名为filename的文件,返回值为文件描述字。
close表示关闭文件描述字handle相连的文件。
文件的读写
int read(int handle, void *buf, int count);
int write(int handle, void *buf, int count);
read()函数从handle(文件描述字)相连的文件中,读取count个字节放到buf所指的缓冲区中,返回值为实际所读字节数,返回-1表示出错。返回0 表示文件结束。
write()函数把count个字节从buf指向的缓冲区写入与handle相连的文件中,返回值为实际写入的字节数。
随机定位函数
int lseek(int handle, long offset, int fromwhere);
该函数对与handle相连的文件位置指针进行定位,功能用法和fseek函数相同。