C语言文件输入输出
文件输入输出:操作对象是文件,文件是按一定格式存储在计算机硬盘等介质的数据。
文件输入:指从文件中读取数据;
文件输出:指输出数据到文件保存。
注:C语言标准输入输出本质上也是文件输入输出,显示器和键盘等设备在C语言中也抽象成文件。字符串输入输出也可以认为字符串是保存在内存中的文件。
C语言在标准库定义了操作文件的相关函数和类型,其中提供FILE类型,FILE类型代表一个文件对象,任何文件打开以后均是该类型的一个对象。
C语言默认已经提供三个FILE类型对象的指针作为标准输入输出,即stdin, stdout, stderr。
文件常用操作
文件常用操作包括:1)打开文件 2)读取文件 3)写入文件 4)关闭文件
1)打开文件
FILE *fopen(const char *filename, const char *mode);
//fopen打开文件,返回指向文件对象的指针。
//参数filename:给定文件名,可以是相对路径或是绝对路径。
//参数mode:打开模式,表示该文件对象读写权限。
//返回值:成功返回相对应的指针,失败返回NULL空指针。
参数mode可以取值以下组合:
对于文本文件:
r 文件只读打开,文件必须存在
w 创建新的文件或者 清空已有文件的内容用于写入
a 打开已有文件在文件末尾添加写入或创建新文件写入
r+ 对已存在的文件以读/写方式打开,文件必须存在
w+ 建立一个新文件或清空已有文件以读/写方式打开
a+ 打开或创建一个文件在文件末尾追加数据
对于二进制文件,mode意义和文本文件一致,但需要加上字符b代表二进制文件。
rb 打开已有的二进制文件,只读
wb 创建新的或清空已有的二进制文件,只写
ab 创建新的或打开已有二进制文件,追加写入
r+b或rb+ 打开已有的二进制文件,读/写方式
w+b或wb+ 创建新的或清空已有的二进制文件,以读/写方式
a+b或ab+ 创建新的或在已有的二进制文件进行追加,以读/写方式
注:带r的模式要求文件必须存在,w模式创建新的文件或清空已有文件内容,a模式创建新的文件或在已有的文件末尾添加。
2)读取文件
按照格式控制字符串要求读取文件:
int fscanf(FILE *stream, const char *format,...);
//按照格式控制字符串从文件中读取数据赋值给相应的参数变量列表。
//返回值:正常返回已成功读取赋值的输入项数数(有可能小于参数个数),失败返回EOF。
按照字符读取文件:
int fgetc(FILE *stream);
//从文件中按照字符读取,成功返回字符值,失败返回EOF。
// 等价fgetc,以宏方式实现。
int getc(FILE *stream);
按照字符串读取文件:
char *fgets(char *s, int n, FILE *stream);
//从文件中读取字符串保存到数组指针s中,最多读取n-1个字符,读取最后字符时自动加入空字符 \0 。
//遇到换行符以后结束,因此换行符也会存入s中。
//返回值:成功返回s,失败返回空指针。
判断文件是否读取完毕:
int feof(FILE *stream);
//测试是否已读取到文件的末尾。
//若到达末尾返回非负值,未到末尾返回0。
3)写入文件
int fprintf(FILE *stream, const char *format, ...);
//将参数变量的值按照一定格式转换成字符串写入文件中。
//参数stream指向可写的FILE类型文件指针。
//format是输出格式控制字符串。
//返回值:正常返回所写入的字符数,失败或出错返回负值。
int fputc(int c, FILE *stream);
//写入字符c到文件中。
//成功返回字符,失败返回EOF。
// 等价fputc
int putc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
//写入字符串到文件中,其中字符串末尾的空字符不写入。
//成功返回非负值,失败返回EOF。
4)关闭文件
文件打开操作完成以后,必须关闭文件。
int fclose(FILE *stream);
//参数是FILE类型的指针,指向文件对象。关闭时会将写入的缓存数据一并写入文件,释放相关资源。
//关闭成功返回0,出错返回EOF。
直接输入输出函数(一)
用于二进制文件输入输出操作,数据以二进制方式输入或输出,不做转换。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//从文件中读取一定大小的二进制数据保存到ptr指定的数组中。
//ptr:指针,指向数据或分配的内存空间
//size:元素类型的大小,例如int型,size=4
//nmemb:元素的个数,例如100个int型,nemb=100
//成功返回读入的元素数,失败返回0。
size_t fwrite(const void *ptr, size_t size,size_t nmemb, FILE *stream);
//将一定大小的二进制数据写入到文件中。
//成功返回写入的元素数,失败返回0。
文件输入输出程序示例1
1.写入文件
#include
int main(){
FILE *fp = NULL;
fp = fopen("mytest.txt", "w");
if(fp != NULL)
fprintf(fp,"%c %d %.2f %s\n",'A',100,100.01f,"test");
fclose(fp);
}
输出:在当前程序目录下新生成mytest.txt文件,记事本打开内容如下:
2.读入文件
#include
int main(){
FILE *fp = NULL;
fp = fopen("mytest.txt", "r");
char c;
int i;
float f;
char str[100];
if(fp != NULL)
// 输入格式串不能有精度
fscanf(fp,"%c%d%f%s",&c,&i,&f,str);
printf("%c %d %.2f %s\n",c,i,f,str);
fclose(fp);
}
输出:A 100 100.01 test
3.1二进制文件写入
# include
struct test{
char c;
int i;
float f;
char str[100];
};
int main(){
FILE *fp = NULL;
fp = fopen("mytest2.txt", "wb");
struct test test;
test.c = 'A';
test.i = 100;
test.f = 100.01f;
test.str[0] = 't';
test.str[1] = 'e';
test.str[2] = 's';
test.str[3] = 't';
test.str[4] = '\0';
int n;
if(fp != NULL)
n= fwrite(&test, sizeof(struct test), 1, fp);
printf("%d\n",n);
fclose(fp);
}
输出:1
,记事本打开文件mytest2.txt,出现乱码,二进制文件无法用记事本直接查看。
3.2二进制文件读取
# include
struct test{
char c;
int i;
float f;
char str[100];
};
int main(){
FILE *fp = NULL;
fp = fopen("mytest2.txt", "rb");
struct test test;
int n;
if(fp != NULL)
n= fread(&test, sizeof(struct test), 1, fp);
printf("%c %d %.2f %s\n",test.c,test.i,test.f,test.str);
fclose(fp);
}
输出:A 100 100.01 test
。
直接输入输出函数(二)
用于二进制文件输入输出操作,数据以二进制方式输入或输出,不做转换。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//从文件中读取一定大小的二进制数据保存到ptr指定的数组中。
//ptr:指针,指向数据或分配的内存空间
//size:元素类型的大小,例如int型,size=4
//nmemb:元素的个数,例如100个int型,nemb=100
//成功返回读入的元素数,失败返回0。
size_t fwrite(const void *ptr, size_t size,size_t nmemb, FILE *stream);
//将一定大小的二进制数据写入到文件中。
//成功返回写入的元素数,失败返回0。
文件输入输出程序示例2
1.写入文件
#include
int main(){
FILE *fp = NULL;
fp = fopen("mytest.txt", "w");
if(fp != NULL)
fprintf(fp,"%c %d %.2f %s\n",'A',100,100.01f,"test");
fclose(fp);
}
输出:在当前程序目录下新生成mytest.txt文件,记事本打开内容如下:
2.读入文件
#include
int main(){
FILE *fp = NULL;
fp = fopen("mytest.txt", "r");
char c;
int i;
float f;
char str[100];
if(fp != NULL)
// 输入格式串不能有精度
fscanf(fp,"%c%d%f%s",&c,&i,&f,str);
printf("%c %d %.2f %s\n",c,i,f,str);
fclose(fp);
}
输出:A 100 100.01 test
3.1二进制文件写入
# include
struct test{
char c;
int i;
float f;
char str[100];
};
int main(){
FILE *fp = NULL;
fp = fopen("mytest2.txt", "wb");
struct test test;
test.c = 'A';
test.i = 100;
test.f = 100.01f;
test.str[0] = 't';
test.str[1] = 'e';
test.str[2] = 's';
test.str[3] = 't';
test.str[4] = '\0';
int n;
if(fp != NULL)
n= fwrite(&test, sizeof(struct test), 1, fp);
printf("%d\n",n);
fclose(fp);
}
输出:1
,记事本打开文件mytest2.txt,出现乱码,二进制文件无法用记事本直接查看。
3.2二进制文件读取
# include
struct test{
char c;
int i;
float f;
char str[100];
};
int main(){
FILE *fp = NULL;
fp = fopen("mytest2.txt", "rb");
struct test test;
int n;
if(fp != NULL)
n= fread(&test, sizeof(struct test), 1, fp);
printf("%c %d %.2f %s\n",test.c,test.i,test.f,test.str);
fclose(fp);
}
输出:A 100 100.01 test
。
------------END------------