在头文件<stdio.h>中提供处理问件的库函数。
文件的两种类型:文本文件和二进制文件
文本文件:将数据写入文本文件时,数据写入为字符,这些字符组成为数据行,在每一行的末尾用换行结束。如果写入的是二进制数据,例如int或者double类型,则先将其转化成字符类型,在写入文件
二进制文件:将数据写入二进制文件时,总是写入一系列字节,与他在内存中的表现形式相同,例如double类型就是写入8个字节。
总结:字符数据本身在内存中就经过了编码,所以无论是二进制还是文本形式都是一样的,而对于非字符数据来说,例如inti=10;如果用二进制来进行存储的话为1010,但是如果需要用文本形式来进行存储的话就必须进行格式化编码(对1和0分别编码,即形式为‘1’和‘0’分别对应的码值)。
打开文件
FILE *fopne( char *name, char *mode)
其中mode可以为:“w”,“a”,“r”
当mode为“w”或者“a“时,如果name为一个包含目录的路径,而且其中有一部分目录不存在,则返回NULL,否则如果只是一个文件名而且在当前目录下没有这个文件,则创建这个文件不返回NULL。
当mode为”r“时,如果文件不存在,则返回NULL。
文件重命名
int rename(const char *oldname, const char *newname)
如果文件删除成功,则返回0;如果文件删除失败,则返回非零值。
删除文件
remove(char *naem)
删除时,文件不应该是打开的。
清除缓冲区(将缓冲区中的数据写入文件中)
fflush(pfile)
如果写入成功的,则返回0;如果写入失败,返回EOF。
在文件中移动
获得文件中的当前位置
int ftell(FILE *pfile)
返回long类型的变量,表示距离文件开头的偏移字节数
int fgetpos(FILE *pfile, fpos_t *position)
成功,则在position中存储当前位置和文件的状态信息,并返回0,否则返回非零整数。
在文件中设定位置
int fseek(FILE *pfile, long offset, int origin)
对于文本文件,origin必须是SEEK_SET,成功,返回0;失败,返回非零值。
int fsetpos(FILE *pfile, fpos_t *position )
成功,返回0;失败,返回非零值。
创建临时文件
FILE pfile;
pfile = tmpfile();
判断是否到达文件尾
feof()
如果文件结束,则返回非0值,否则返回0.
文本文件操作
向文本文件中写入一个字符
int fputc(int c, FILE *pflie)
写入成功,返回写入的字符;写入失败,返回EOF。
注意:fputc ()函数与putc()函数等价,唯一的区别就是putc()函数是一个宏,而fputc()实现为一个函数。
从文本文件中读取一个字符
int fgetc( FILE* pfile)
读取成功,将返回读取的字符;读取失败,则返回EOF。
注意:fgetc ()函数与getc()函数等价,唯一的区别就是getc()函数是一个宏,而fgetc()实现为一个函数。
向文本文件中写入字符串
int fputs( char *pstr, FILE *pfile)
将字符串写入文件直到碰到‘\0’,但是‘\0’不会写入文件。通常是写入一行字符串最后加一个换行符。
写入成功,返回0或者整数,否则返回EOF。
从文本文件中读取字符串
char *fgets( char *pstr, int nchars, FILE *pfile)
从文本文件中读取字符串,直到碰到‘\n’或者已经读入nchars-1个字符为止。
读取成功,返回pstr指针;否则返回NULL。
格式化文件输入输出
输入到文件:fprintf(FILE* pflie, ”格式字符串“, 变量);
从文件输出:fscanf(FILE* pflie, ”格式字符串“, 变量);
注意:数据存放在文件中,只是存放字节,这些字节的意义取决与你怎么解释它们。
代码框架如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
FILE *file1 = NULL;
FILE *file2 = NULL;
char str[] = "sdgfsdfgdsgfsdgd!";
int len = strlen(str);
int ch = 0;
int const CHAR_MAX = 80;
char *proverbs[] ={
"sdgfsdgdfsgfdsgds\n",
"dfgfsdgdfshhhhhhhfdgj",
"sgdfsfdshsdfh"
"dsgdfshdshds\n"
};
if(!(file1 = fopen("test1.txt", "w")))
{
printf("打开文件失败");
exit(1);//使用此函数必须引入stdlib.h头文件
}
/*
向文本文件中写入一个字符
*/
size_t i ;
for ( i = 0; i < len; i++)
{
if( fputc(str[i], file1) != EOF )
{
printf("写入%c成功\n", str[i] );
}
}
/*
向文本文件中写入字符串
*/
int count = sizeof(proverbs)/sizeof(proverbs[1]);
size_t j ;
for(j = 0; j < count; j++)
{
if ( fputs(proverbs[j], file1) != EOF) {
printf("成功将字符串%s写入文件\n", proverbs[j]);
}else{
printf("写入字符串%s失败\n", proverbs[j]);
}
}
fflush(file1);
fclose(file1);
if (!(file2 = fopen("test1.txt", "r"))) {
printf("打开文件失败" );
exit(1);
}
/*
从文本文件中读取一个字符
while ( (ch = fgetc(file2)) != EOF) {
printf("从文件中读取%c成功!\n",ch );
}
*/
/*
从文本文件中读取字符串
*/
char temp[CHAR_MAX];//char temp = NULL;不可以
while( fgets(temp, CHAR_MAX, file2))
{
printf("从文本文件中读取字符串:%s\n",temp );
}
fclose(file2);
return 0;
}
注意:在将数据写入文件之后并不可以马上读取,同样,在读取文件数据之后也不可以马上写文件。因为将数据写入到文件之后,并不是将数据写到外部设备上,而是将其放入缓冲区中,直到缓冲区满了或者发生其他情况,才将数据写入文件中。同理,当读取文件数据的时候,会将数据读取到缓冲区中,直到缓冲区的数据空了,才会继续从文件中读取数据。因此,在读模式和写模式之间进行转换的时候,需要使用fflush()函数刷新缓冲区。
二进制文件操作
写入二进制文件
size_t fwrite( const void* buffer, size_t size, size_t count, FILE* pfile)
写入成功,则返回与count一样的数,否则,返回其真实写入的数据的个数。
读区二进制文件
size_t fread ( void *buffer, size_t size, size_t count, FILE *pfile)
读取成功,则返回与count一样的数,否则,返回其真实读取的数据的个数。