这节来探讨一下C语言里的文件操作。
目录
一、打开文件
打开文件,就是获取文件的有关信息,
这些信息会被保存到一个 FILE 类型的结构体变量中,它包含了所有用来控制流的必要的信息。
关闭文件就是断开与文件之间的联系,释放结构体变量,同时禁止再对该文件进行操作。
打开成功后结束使用要记得关闭文件。
FILE *fopen( const char *filename, const char *mode );
我们可以使用 fopen() 函数来创建一个新的文件或者打开一个已有的文件,
这个调用会初始化类型 FILE 的一个对象,关闭文件则使用fclose()函数。
在这里,filename 是文件名;访问模式 mode 的值可以是下列值中的一个:
如果是二进制文件,则需使用下面的访问模式:
"rb", "wb", "ab", "rb+", "wb+", "ab+"
来个栗子:
int main()
{
//打开文件
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
//空指针打开异常
perror("fopen");
return -1;
}
//关闭文件
fclose(pf);
pf == NULL
return 0;
}
二、输入数据
能打开文件了,接下来我们要输入数据。
2.1 字符
这里主要使用两个函数:fgetc()、fputc()
int fgetc( FILE *stream );//读取
int fputc( int c, FILE *stream );//输入
字符输入:
int main()
{
FILE* pf = fopen("data.txt", "w");
if (NULL == pf)
{
perror("fopen");
return -1;
}
fputc("b", pf);
fclose(pf);
pf = NULL;
return 0;
}
字符输出:
int main()
{
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return -1;
}
int ch = fgetc(pf);
printf("%c", ch);
fclose(pf);
pf = NULL;
return 0;
}
2.2 文本行
一个字符肯定满足不了,这是需要字符串来表达怎么办呢?
int fputs( const char *string, FILE *stream );
char *fgets( char *string, int n, FILE *stream );
这里要注意以下fgets()函数的n,如果写4,实际只读三个数据,
它会默认在第四个位置方上 '\0' 作为结束标志。
输入:
fputs("bit", pf);
输出:
char ch[20] = { 0 };
fgets(ch, 4, pf);//只读三个数据
printf("%s", ch);
2.3 格式化文本
int fprintf( FILE *stream, const char *format [, argument ]...);
int fscanf( FILE *stream, const char *format [, argument ]... );
这个两个函数后面的参数与printf内的参数一模一样。
输入:
int ch = 4;
fprintf(pf, "%d", ch);
输出:
int ch = 0;
fscanf(pf, "%d", &ch);
printf("%d", ch);
2.4 二进制
这种是以二进制的方式写入文本,也对应两个函数。
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
buffer就是存放写入或输出的指针
将count个size大小的数据从文件中放入或取出
输入注意要 'wb', 输出则'rb'
输入:
int ch = 5;
fwrite(&ch, sizeof(ch), 1, pf);
//将一个ch大小的数从ch中取出存入pf中
输出:
int ch = 0;
fread(&ch, sizeof(ch), 1, pf);
printf("%d", ch);
2.5 sscanf与sprintf
提到fscanf与fprintf,这里有必要提两个函数。
int sscanf( const char *buffer, const char *format [, argument ] ... );
int sprintf( char *buffer, const char *format [, argument] ... );
这个函数就是将一个格式化的数据转换为字符串,看栗子:
struct S
{
int n;
double d;
char name[10];
};
int main()
{
char arr[100] = { 0 };
struct S tmp = { 0 };
struct S s = { 100, 3.14, "zhangsan" };
//把一个格式化的数据转换成字符串
sprintf(arr, "%d %lf %s", s.n, s.d, s.name);
//打印
printf("%s\n", arr);
//从arr中的字符串中提取出一个格式化的数据
sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name);
//打印
printf("%d %lf %s\n", tmp.n, tmp.d, tmp.name);
return 0;
}
2.6 随机读写
这里虽然写着随机,但并不是真正意义上的随机。
有三个函数:
第一个是读取文件指定位置的字符
第二个是返回文件内所指向的位置
第三个是回到文件的起始处
fseek的第三个参数:
用法如下: (文件内存着abcdef)
int main()
{
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return;
}
fseek(pf, 2, SEEK_CUR);//指向文件内的第二个字符
int ch = fgetc(pf);
printf("%c\n", ch);
int s = ftell(pf);//显示偏移量
printf("%d\n", s);
rewind(pf);//回到起始位置
ch = fgetc(pf);
printf("%c\n", ch);
fclose(pf);
pf = NULL;
return 0;
}
结果如下:
感谢你能看到这,如有帮助,欢迎点个赞👍。