所谓文件,指的是存储在硬盘上的数据块。
根据读写方式:
根据数据存放格式:
由此可见,文本文件占用空间比二进制大,进行ASCII码也要额外耗费时间,但是利于处理单个字符。
只有数字存储会有区别,字符存储都是使用ASCII码存储,两种文件存储方式占用一样。
文件指针是一种特殊指针,使用结构体来完成的:
FILE *a;
a=fopen("edit.txt","r");
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //文件的起始位置
int _flag; //flag是文件标志位
int _file; //file是文件的有效性
int _charbuf; //缓冲区检查
int _bufsiz; //文件大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
1)定义文件指针;
2)打开文件;
3)读写文件;
4)关闭文件。
打开文件:
FILE *fopen(const char *fname,const char *mode);
其中fname是要打开的文件名,mode指文件的打开方式
关闭文件:
int fclose(FILE *fp);
关闭成功,返回0,否则返回-1。
fclose把缓冲区的内容输出到磁盘中,释放文件指针和有关缓冲区。如果没有使用fclose关闭文件,那么可能因为缓冲区没满导致数据丢失。
案例:
#include
int main()
{
FILE *fp;
fp=fopen("edit.txt","r");
if(fp==NULL)
{
printf("打开文件失败\n");
fp=fopen("edit.txt","wr");
if(NULL==fp)
{
printf("创建文件失败\n");
return 0;
}
printf("打开文件成功\n");
fclose(fp);
}
return 0;
}
打开文件失败
打开文件成功
在C语言中,EOF是这样的:
#define EOF (-1)
EOF只能用作文本文件的结束标志,因为文本文件使用ASCII码作为结束标志,而ASCII码中不会出现-1。
EOF不仅可以判断文本文件是否结束,还能判断输入是否完成:
while((c=getchar())!=EOF)
{
...
}
正常输入都会是正常调用,只有按下CTRL+C时会返回-1,所以EOF还可以判断输入结束。
但是在二进制文件中,不能采用EOF作为文件结束符,因为二进制文件中会出现-1。
因此,判断文件的结束,使用FEOF标志符:
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)
文件指针的位置是使用成员变量_ptr
来标识的,当文件指针到达文末并读写时,文件的状态标识符会被置位_IOEOF
。
FILE *fpin;
char c;
fpin=fopen("data.dat","rb");
while(!feof(fpin))
{
//这个printf有说法,如果放在c=getc(fpin);下边,就会多输出一个FFFFFFFF数据,所以逻辑是先读取再判断,而不是先读取再输出再判断。
printf("%x\n",c);
//getc的作用是读取一个字节,并前进一个指针
c=getc(fpin);
}
int fputc(int ch,FILE *fp);
向文件流写入一个字符,成功返回写入的字符,失败返回EOF。
int fgetc(FILE *fp);
从文件流中读取一个字符,返回读取的字节,如果到文件末尾就返回EOF。
int fputs(char *string,FILE *fp);
将string指向的字符串写入fp所指定的文件中。
char* fgets(char *s,int size,FILE *fp);
从文件中读取size个字符存到s中,直到出现换行符、文件尾或已读的size-1个字符为止,最后加上NULL表示字符串结束,成功返回0,失败返回非0。
int fscanf(FILE *fp,char *format,[argument...]);
向fp文件指针指向的文件中写入字符,成功返回读出的个数,失败返回EOF。
int fprintf(FILE *fp,char *format[,argument]);
根据指定的格式format写入参数到fp指向的文件中,成功返回输出的字符数,失败返回负数。
size_t fwite(const void *buffer,size_t size,size_t count,FILE *fp);
将数据块写入文件。
buffer是数据地址,size是一次写入的字节数,count是写入次数,fp是文件。
成功返回写入的字节数。
size_t fread(void *buffer,size_t size,size_t count,FILE *fp);
从fp文件中读取一个数据块。
buffer是要读入的地址,size是要读取的字节数,count是要读取的个数。
块读写和字符串读写的区别是:
块读写按个数读写;
字符串读写按结束符\0读写。
void rewind(FILE *fp);
将位置指针重新定位到文件开头。
int fseek(FILE *fp,long offset,int fromwhere);
fp是文件指针,offset是相对fromwhere的偏移量,fromwhere的取值如下:
long ftell(FILE *fp);
返回位置指针相对于文件首的偏移字节数。
int ferror(FILE *fp);
检查fp指向的文件是否有读写错误,没错返回0,出错返回非0.
void clearerr(FILE *fp);
恢复错误标志。
void perror(const char *s);
输出上一次错误到stderr,输出时先输出s指定的字符串。
char *strerror(int errnum);
printf("%s\n",strerror(errno));
出错信息为:No such file or directory
将错误信息以字符串形式显示。