一,文件指针---FILE*
二,文件的打开与关闭
2.1 文件打开函数------fopen
函数声明:FILE * fopen ( const char * filename, const char * mode );
函数介绍:该函数使用成功会打开一个文件,并返回一个文件指针来维护这个文件,使用失败会返
回一个NULL.该函数的第一参数是一个文件名,第二个参数是该文件的打开方式,如"w","a","r"等
等,下面是打开方式的总结:
文件使用方式
|
含义
|
如果指定文件不存在
|
"r"(只读)
|
为了输入数据,打开一个已经存在的文本文件
|
出错
|
"w"(只写)
|
为了输出数据,打开一个文本文件
|
建立一个新的文件
|
"a"(追加)
|
向文本文件尾添加数据
|
建立一个新的文件
|
“rb”
(只读)
|
为了输入数据,打开一个二进制文件
|
出错
|
"wb”
(只写)
|
为了输出数据,打开一个二进制文件
|
建立一个新的文件
|
“ab”
(追加)
|
向一个二进制文件尾添加数据
|
出错
|
“r+”
(读写)
|
为了读和写,打开一个文本文件
|
出错
|
"w+”
(读写)
|
为了读和写,建议一个新的文件
|
建立一个新的文件
|
“a+”
(读写)
|
打开一个文件,在文件尾进行读写
|
建立一个新的文件
|
“rb+”
(读写)
|
为了读和写打开一个二进制文件
|
出错
|
“wb+”
(读写)
|
为了读和写,新建一个新的二进制文件
|
建立一个新的文件
|
“ab+”
(读写)
|
打开一个二进制文件,在文件尾进行读和写
|
建立一个新的文件
|
2.2文件关闭函数----fclose
函数声明:int fclose ( FILE * stream );
函数介绍:该函数调用成功返回一个0,调用失败返回一个EOF(-1),参数为一个文件指针。
例如:
#include<stdio.h>
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "w");//以写的方式打开文件
if (pf == NULL)//判断文件是否打开成功
{
perror("");//该函数能打印出文件打开失败的原因
return 1;
}
//使用文件。。。
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
三,文件的顺序读写
3.1字符输出函数----fputc
函数声明:int fputc ( int character, FILE * stream );
函数介绍:向steam指向的文件中输入一个字符,第一个参数是字符(或ASCII值),第二个参数
是文件指针
例如:
#include<stdio.h>
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "w");//以写的方式打开文件
if (pf == NULL)//判断文件是否打开成功
{
perror("");//该函数能打印出文件打开失败的原因
return 1;
}
//使用文件
int i = 0;
for (i = 0; i < 26; i++)
{
fputc('a' + i, pf);//向文件中输入字符'a''b''c'....
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
3.2字符输入函数----fgetc
函数声明:int fgetc ( FILE * stream );
函数介绍:从头读取steam指向的文件中的字符,每次读取一个字符,返回该字符的ASCII值,若
读取失败,则返回EOF(-1)
例如:
#include<stdio.h>
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "r");//以读的方式打开文件
if (pf == NULL)//判断文件是否打开成功
{
perror("");//该函数能打印出文件打开失败的原因
return 1;
}
//使用文件。。。
int ch = fgetc(pf);//读出文件中的字符'a'
printf("%c ", ch);
ch = fgetc(pf);//读出文件中的字符'b'
printf("%c ", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
3.3文本行输出函数----fputs
函数声明:int fputs ( const char * str, FILE * stream );
函数介绍:该函数向stem指向的文件输入一行字符串,若失败返回EOF,第一个参数是字符指
针,第二个参数是文件指针(注:1.遇到'\0'停止,2.不会自动换行)
例如:
#include<stdio.h>
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "w");//以写的方式打开文件
if (pf == NULL)//判断文件是否打开成功
{
perror("");//该函数能打印出文件打开失败的原因
return 1;
}
//使用文件
fputs("abcdefg", pf);
//向文件中输入字符串"abcdefg"
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
3.4文本行输入函数---fgets
函数声明:char * fgets ( char * str, int num, FILE * stream );
函数介绍:将steam指向的文件中的数据输入到str指向的地址处,最多读取num个字符,失败返回
一个NULL。
注:实际上最多只能读取num-1个字符,因为最后一个字符必定是'\0'
例如:
#include<stdio.h>
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "r");//以读的方式打开文件
if (pf == NULL)//判断文件是否打开成功
{
perror("");//该函数能打印出文件打开失败的原因
return 1;
}
//使用文件。。。
char arr[20] = { 0 };
fgets(arr, 5, pf);
printf("%s ", arr);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
3.5二进制输出函数----fwrite
函数声明:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
函数介绍:将ptr指向的数据输入到steam指向的文件中,返回成功写入的元素总数,第一个参数是
指向要写入的元素数组的指针,第二个参数是要写入的每个元素的大小(以字节为单位),第三个
参数是每个元素的大小,第四个参数是流(输入流,即数据写入哪里)
#include<stdio.h>
struct S
{
int a;
float b;
char c;
};
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("");
return 1;
}
struct S s = { 10,45,'a' };
fwrite(&s, sizeof(struct S), 1, pf);
//将结构体s中的数据输入到pf指向的文件中
fclose(pf);
pf = NULL;
return 0;
}
3.6二进制输入函数----fread
函数声明:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
函数介绍:将steam指向的文件中count个size大小的数据输入到ptr指向的空间中,返回成功读取的
元素总数。如果此数字与 count 参数不同,则表示读取时发生读取错误或到达文件末尾。在这两种
情况下,都会设置正确的指标,可以分别用 ferror 和 feof 进行检查。如果大小或计数为零,则该
函数返回零,并且流状态和 ptr 指向的内容保持不变。size_t是无符号整数类型。
例如:
#include<stdio.h>
struct S
{
int a;
float b;
char c;
};
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("");
return 1;
}
struct S s = { 0 };
fread(&s, sizeof(struct S), 1, pf);
//将结构体s中的数据输入到pf指向的文件中
printf("%d %lf %c", s.a, s.b, s.c);
fclose(pf);
pf = NULL;
return 0;
}
四,scanf/fscanf/sscanf 与printf/fprintf/sprintf的对比
4.1 fscanf函数
函数声明:int fscanf ( FILE * stream, const char * format, ... );
函数介绍:将steam指向的文件中的数据以一定的格式输入到变量中。
4.2 fprintf函数
函数声明: int fprintf ( FILE * stream, const char * format, ... );
函数介绍:将变量中的数据以一定的格式输入到steam指向的文件中。
例子:
#include<stdio.h>
struct S
{
int a;
float b;
char c;
};
int main()
{
FILE* pf = fopen("test1.txt", "w");
if (pf == NULL)
{
perror("");
return 1;
}
struct S s1 = { 12, 2.3f, 'a' };
struct S s2 = { 0 };
//将s1中的数据输入到pf指向的文件中
fprintf(pf, "%d %f %c", s1.a, s1.b, s1.c);
fclose(pf);
pf = NULL;
pf = fopen("test1.txt", "r");
if (pf == NULL)
{
perror("");
return 1;
}
//将pf指向的文件中的数据输出到s2中
fscanf(pf, "%d %f %c", &s2.a, &s2.b, &s2.c);
printf("%d %f %c", s2.a, s2.b, s2.c);
fclose(pf);
pf = NULL;
return 0;
}
4.3 sscanf函数
函数声明:int sscanf ( const char * s, const char * format, ...);
函数介绍:把字符串写成格式化的数据
4.4 sprintf函数
函数声明:int sprintf ( char * str, const char * format, ... );
函数介绍:把格式化的数据转换成字符串,储存到str指向的空间
例子:
#include<stdio.h>
struct S
{
int a;
float b;
char c;
};
int main()
{
struct S s1 = { 13,2.3f,'a' };
struct S s2 = { 0 };
char a[20] = { 0 };
sprintf(a, "%d %f %c", s1.a, s1.b, s1.c);
printf("%s\n", a);
sscanf(a, "%d %f %c", &s2.a, &s2.b, &s2.c);
printf("%d %f %c", s2.a, s2.b, s2.c);
return 0;
}
总结:
scanf函数 :针对标准输入流(stdin)的格式化的输入函数
printf函数 :针对标准输出流(stdout)的格式化的输出函数
fscanf函数:针对所有输入流(文件流/stdin)的格式化的输入函数
fprintf函数:针对所有输出流(文件流/stdout)的格式化的输出函数
sscanf函数:把字符串转换成格式化的数据
sprintf函数:把格式化的数据转换成字符串
五,文件的随机读写
5.1 fseek
函数声明:int fseek ( FILE * stream, long int offset, int origin );
函数介绍:改变指针的位置实现随机读写,第二个参数是偏移量,向右偏移为正,第三个参数是文
件指针的位置。
有三个选择:SEEK_CUR(初始位置),SEEK_END(结束位置),SEEK_SET(当前位置)
例子:
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("");
return 1;
}
fseek(pf, 3, SEEK_CUR);
int ch = fgetc(pf);
printf("%c\n", ch);//d
fclose(pf);
pf = NULL;
return 0;
}
5.2 ftell
函数声明:long int ftell ( FILE * stream );
函数介绍:返回文件指针相对于起始位置的偏移量
例子:
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("");
return 1;
}
fseek(pf, 3, SEEK_CUR);//指针向右偏移3位
int ch = ftell(pf);
printf("%d\n", ch);//3
fclose(pf);
pf = NULL;
return 0;
}
5.3 rewind
函数声明:void rewind ( FILE * stream );
函数介绍:让指针的位置返回到文件的起始位置
例子:
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("");
return 1;
}
fseek(pf, 3, SEEK_CUR);//向右偏移3位
int ch = ftell(pf);
printf("%d\n", ch);//3
rewind(pf);//使指针返回初始位置
ch = ftell(pf);
printf("%d\n", ch);//0
fclose(pf);
pf = NULL;
return 0;
}
六,feof 和 ferror
feof函数是在文件读取结束时,判断是读取失败,还是文本结束
ferror函数是用来判断函数调用是否出现错误
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("");
return 1;
}
int c;
while ((c = fgetc(pf)) != EOF)
{
putchar(c);
printf("\n");
}
if (ferror(pf))
perror("ferror");
else if (feof(pf))
perror("feof");
fclose(pf);
pf = NULL;
return 0;
}