C语言文件操作详细讲解
目录
- 文件的打开和关闭
- fopen和fclose
- 文件的输入输出
- 字符输入输出:fputc和fgetc
- 字符串输入输出:fputs和fgets
- 格式化输入输出:fscanf和fprintf
- 数据块输入输出:fread和fwrite
文件的打开和关闭
文件的打开使用的是函数fopen,它是stdio函数库中的函数,函数原型为
FILE *fopen( const char * filename, const char * mode );
- const char * filename为文件名
- const char * mode为打开的方式
该函数返回一个指向文件的指针
FILE *fp;
函数打开方式有很多:
读写方式 | 文件类型 | 含义 | 读写方式 | 文件类型 | 含义 |
---|---|---|---|---|---|
“r” | 文本文件 | 打开文本,只读 | “rb+” | 二进制文件 | 打开二进制文件,读、覆盖写 |
“w” | 文本文件 | 建立文本文件,只写 | “wb+” | 二进制文件 | 打开二进制文件,先写后读 |
“a” | 文本文件 | 打开文本文件,追加 | “ab+” | 二进制文件 | 打开二进制文件,读,追加 |
“rb” | 二进制文件 | 打开二进制文件,只读 | “rt” | 文本文件 | 打开文本文件,只读 |
“wb” | 二进制文件 | 建立二进制文件,只写 | ’‘wt” | 文本文件 | 建立文本文件,只写 |
“ab” | 二进制文件 | 打开二进制文件,读、追加 | “at” | 文本文件 | 打开文本文件,追加 |
“r+” | 文本文件 | 打开文本文件,读、覆盖写 | “rt+” | 文本文件 | 打开文本文件,读、覆盖写 |
“w+” | 文本文件 | 打开文本文件,先写后读 | “wt+” | 文本文件 | 打开文本文件,先写后读 |
“a+” | 文本文件 | 打开文本文件,读、追加 | “at+” | 文本文件 | 打开文本文件,读、追加 |
文件的关闭使用的是fclose函数,该函数也在函数库stdio.h中,函数原型为:
int fclose( FILE *fp );
文件的输入输出
字符输入输出
fputc函数在函数库stdio.h中,函数原型为:
int fputc( int c, FILE *fp );
该函数将单个字符或数字写入文件中;
fgetc函数在函数库stdio.h中,函数原型为:
int fgetc( FILE * fp );
该函数从文件中读出一个数或字符并返回
#include <stdio.h>
/*单个字符输入输出 */
/*简单打开文件并用fputc和fgetcxie读文件 并用feof检查是否结束*/
int main()
{
FILE * fd = NULL;
char ch = ' ';
char sh = ' ';
fd = fopen("test.txt", "w"); //以w打开文件
for(int i = 0;i<10;i++)
{
ch = getchar(); //将字符交给ch
fputc(ch, fd); //将ch写入文件
}
fclose(fd); //关闭文件
fd = fopen("xiaofei.txt", "r");
int i = 0;
while(i != 1)
{
sh = fgetc(fd); //将fd指的一个字符给sh
printf("%c", sh); //输出sh
i = feof(fd); //检查指针fd是否指向文本结束
}
fclose(fd); //关闭文件
return 0;
}
字符串输入输出
fputs函数在函数库stdio.h中,该函数原型为:
int fputs( const char *s, FILE *fp );
该函数将s字符串写入文件中,如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF;
fputs函数在函数库stdio.h中,该函数的原型为:
char *fgets( char *buf, int n, FILE *fp );
该函数将从文件中读出大小为n-1的字符串,它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。如果这个函数在读取最后一个字符之前就遇到一个换行符 ‘\n’ 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。
#include <stdio.h>
/*用fputs和fgets输入输出文件中的内容 */
/*注意fputs和fgets还有其他用法 */
int main()
{
FILE * fp;
char ch[100];
char sh[100];
fp = fopen("xiaofei.txt", "w");
fgets(ch,100,stdin);
fputs(ch,fp);
fclose(fp);
fp = fopen("xiaofei.txt", "r");
fgets(sh, 100, fp);
fputs(sh,stdout);
fclose(fp);
return 0;
}
格式化输入输出
fprintf函数在函数库stdio.h中,该函数的原型为:
int fprintf(FILE *fp,const char *format, ...);
该函数用来将数据写如文件,下面会演示。
fscanf函数在函数库stdio.h中,该函数的原型为:
int fscanf(FILE *fp, const char *format, ...);
该函数将文件中的数据取出,下面演示:
#include <stdio.h>
#include <stdlib.h>
#define N 2
struct stu{
char name[10];
int num;
int age;
float score;
} boya[N], boyb[N], *pa, *pb;
int main()
{
FILE *fp;
int i;
pa=boya;
pb=boyb;
if( (fp=fopen("D:\\demo.txt","wt+")) == NULL )
{
puts("Fail to open file!");
exit(0);
}
//从键盘读入数据,保存到boya
printf("Input data:\n");
for(i=0; i<N; i++,pa++)
{
scanf("%s %d %d %f", pa->name, &pa->num, &pa->age, &pa->score);
}
pa = boya;
//将boya中的数据写入到文件
for(i=0; i<N; i++,pa++)
{
fprintf(fp,"%s %d %d %f\n", pa->name, pa->num, pa->age, pa->score);
}
//重置文件指针
rewind(fp);
//从文件中读取数据,保存到boyb
for(i=0; i<N; i++,pb++)
{
fscanf<N; i++,pb++)
{
prin(fp, "%s %d %d %f\n", pb->name, &pb->num, &pb->age, &pb->score);
}
pb=boyb;
//将boyb中的数据输出到显示器
for(i=0; i<N; i++,pb++)
{
printf("%s %d %d %f\n", pb->name, pb->num, pb->age, pb->score);
}
fclose(fp);
return 0;
}
数据块输入输出
fwrite函数在函数库stdio.h中,函数原型为:
size_t fwrite(void *buf, size_t size, size_t count, FILE *fp);
- size为每次写入的字符个数
- count为写入的次数
- buf为写入的数据
- 该函数将buf中的内容写入fp所指的文件中
fread函数在函数库stdio.h中,函数原型为:
size_t fread(void *buf, size_t size, size_t count, FILE *fp);
- size为没次读出时字符的个数
- count为读取的次数
- buf为读出的内容
- 该函数将fp所指的文件的内容读到buf中
#include <stdio.h>
/*使用fwrite和fread两个函数进行文件的数据块输入/输出 */
int main()
{
FILE *fp;
char ch[100];
char sh[100];
fp = fopen("xiaofei.txt","w");
fgets(ch,100,stdin); //字符串输入
fwrite(ch,50,2,fp); //将字符串ch存入文件
fclose(fp);
fp = fopen("xiaofei.txt", "r");
fread(sh,100,1,fp); //将文件中的二进制读出存在sh中
fputs(sh,stdout); //输出sh
fclose(fp);
return 0;
}