本客重点
1. 文件的打开与关闭
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC规定了使用fopen函数来打开文件,fclose来关闭文件。
FILE* fopen(const char* filename,const char* mode);
int fclose(FILE* stream);
打开方式如下:
文件使用方式 | 含义 |
---|---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 |
“w”(只写) | 为了输出数据,打开一个文本文件 |
“a”(追加) | 向文本文件尾部添加数据 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 |
“wb”(只写) | 为了输出数据,打开了一个二进制文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 |
“r+”(读写) | 为了读和写,打开一个文本文件 |
“w+”(读写) | 为了读和写,创建一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 |
“rb+”(读写) | 为了读和写打开一个二进制文件 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 |
2. 文件的顺序读写
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
2.1 fputc
int putc ( int character, FILE * stream );
实操一下:
int main()
{
//打开文件
FILE* pf = fopen("data.txt","w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fputc('a',pf);
fputc('b', pf);
fputc('c', pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
2.2 fgetc
int fgetc ( FILE * stream );
实操一下:
int main()
{
//打开文件
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = fgetc(pf);
printf("%c\n",ch);
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
2.3 fputs
int fputs ( const char * str, FILE * stream );
实操一下:
int main()
{
FILE* pf = fopen("data.txt","w");
if (NULL == pf)
{
perror("fopen");
return 1;
}
//写文件 - 写一行
fputs("hello world\n",pf);
fputs("hello\n", pf);
fclose(pf);
pf = NULL;
return 0;
}
2.4 fgets
char * fgets ( char * str, int num, FILE * stream );
这里将我们从stream中读取num个字符放到str数组中。
int main()
{
FILE* pf = fopen("data.txt","r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
//读文件 - 读一行
char arr[10] = { 0 };
fgets(arr,10,pf);
printf("%s\n",arr);
fclose(pf);
pf = NULL;
return 0;
}
一次读十个字符,如果遇到换行符则停止。
2.5 fprintf
int fprintf ( FILE * stream, const char * format, ...);
实操一下:
struct S
{
int a;
float s;
};
int main()
{
FILE* pf = fopen("data.txt", "w");
if (NULL == pf)
{
perror("fopen");
return 1;
}
struct S s = { 5,3.14f };
fprintf(pf,"%d %f",s.a,s.s);
fclose(pf);
pf = NULL;
return 0;
}
2.6 fscanf
int fscanf ( FILE * stream, const char * format, ... );
实操一下:
struct S
{
int a;
float s;
};
int main()
{
FILE* pf = fopen("data.txt", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
struct S s = {0 };
fscanf(pf,"%d %f",&(s.a),&(s.s));
printf("%d %f",s.a,s.s);
fclose(pf);
pf = NULL;
return 0;
}
2.7 fwrite
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
实操一下:
struct S
{
int a;
float s;
char str[10];
};
int main()
{
struct S s = { 50,6.18f,"hello" };
FILE* pf = fopen("data.txt","wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fwrite(&s,sizeof(struct S),1,pf);
fclose(pf);
pf = NULL;
return 0;
}
2.8 fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
实操一下:
struct S
{
int a;
float s;
char str[10];
};
int main()
{
struct S s = { 0 };
FILE* pf = fopen("data.txt", "rb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fread(&s, sizeof(struct S), 1, pf);
printf("%d %f %s",s.a,s.s,s.str);
fclose(pf);
pf = NULL;
return 0;
}