目录
- 1.操作的准备
- 2.文件的打开
- 3.文件的使用方式
- 4.相关的函数
- 4.1 fputc
- 4.2 fgetc
- 4.3 fputs
- 4.4 fgets
- 4.5 fprintf
- 4.6 fscanf
- 4.7 fwrite
- 4.8 fread
1.操作的准备
c语言中的文件操作相关函数的头文件都是在#include<stdio.h>里
除此之外还得定义一个文件指针对目标文件进行指向操作,一般形式为:FILE *指针变量名;
例如:FILE *fp
2.文件的打开
对于数据的处理一般有两种存放形式:文本文件和二进制文件
想要操作文件,那肯定先得把它打开,而在C语言中一般使用fopen函数打开文件
一般形式为:fopen(文件名,文件操作形式);
该函数成功实现将返回一个文件指针,失败则返回NULL
例如:
FILE* pf = fopen("test.txt", "w");
一般为了保证文件正常打开,会进行以下测试:
if (pf == NULL)
{
perror("fopen");
return 1;
}
3.文件的使用方式
使用文件的方式如下:
“r”(只读):为输入打开一个文本文件 对文件进行读操作
“w”(只写):为输出打开一个文本文件 对文件进行写操作
“a”(追加): 向文本文件尾添加数据
“rb”(只读): 为输入打开有一个二进制文件
“wb”(只写):为输出打开一个二进制文件对文件进行写操作
“ab”(追加): 向二进制文件尾添加数据
“r+”(读写): 为读写打开一个文本文件
“w+”(读写):为读写建立一个新的文本文件
“a+”(读写): 向文本文件尾添加数据
“rb+”(读写): 为读写打开一个二进制文件
“wb+”(读写):为读写建立一个新的二进制文件
“ab+”(读写): 为读写打开一个进制文件
4.相关的函数
4.1 fputc
从输入流缓冲区中取出下一个字符并将字符放入文本文件中
int fputc ( int character, FILE * stream );
样例:
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
char ch = 'a';
for (ch = 'a'; ch <= 'z'; ch++)
{
fputc(ch, pf);
}
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
4.2 fgetc
向文本文件中写出一个单个字符
int fgetc ( FILE * stream );
样例:(文本文件与fputc调用相同)
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
4.3 fputs
从输入流缓冲区中取出下一个字符串并将字符放入文本文件中
int fputs ( const char * str, FILE * stream );
样例:
int main()
{
char arr[256] = { 0 };
FILE* pf = fopen("test.txt.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fputs("ssssssssssssssssss\n", pf);
fputs("llllllllllllllllll\n", pf);
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
4.4 fgets
向文本文件中写出一个字符串
char * fgets ( char * str, int num, FILE * stream );
样例:(文本文件与fputs调用相同)
int main()
{
char arr[256] = { 0 };
FILE* pf = fopen("test.txt.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fgets(arr, 255, pf);
printf("%s", arr);
fgets(arr, 255, pf);
printf("%s", arr);
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
4.5 fprintf
格式化输出到一个流文件中
int fprintf ( FILE * stream, const char * format, ... );
样例:
struct s
{
char name[20];
int age;
double score;
};
#include<stdio.h>
int main()
{
struct s s = { "雾都",20,98.5 };
FILE* pf = fopen("test.txt.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fprintf(pf, "%s %d %lf", s.name, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
4.6 fscanf
用于读取数据
int fscanf ( FILE * stream, const char * format, ... );
样例:(文本文件与fprintf调用相同)
struct s
{
char name[20];
int age;
double score;
};
#include<stdio.h>
int main()
{
struct s s = { 0 };
FILE* pf = fopen("test.txt.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fscanf(pf, "%s %d %lf", s.name, &(s.age), &(s.score));
printf("%s %d %lf", s.name, s.age, s.score);
/*fprintf(stdout, "%s %d %lf", s.name, s.age, s.score);*/
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
4.7 fwrite
将 count 个大小为 length 的对象从名为 buffer 的数组二进制写入输入流文件名。
size_t fwrite(void *buffer, size_t length, size_t count, FILE *filename);
样例:
#include<stdio.h>
struct s
{
char name[20];
int age;
double score;
};
int main()
{
struct s s = { "雾都",20,98.5 };
FILE* pf = fopen("test.txt.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//二进制的写
fwrite(&s, sizeof(struct s), 2, pf);
fclose(pf);
return 0;
}
运行结果:(因为是转成二进制了,倒也正常)
4.8 fread
二进制读取count
大小对象的数量length
从输入流filename
到名为的数组buffer
size_t fread(void *buffer, size_t length, size_t count, FILE *filename);
样例:(二进制文件与fwrite调用相同)
struct s
{
char name[20];
int age;
double score;
};
int main()
{
struct s s = { "雾都",20,98.5 };
FILE* pf = fopen("test.txt.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//二进制的读
fread(&s, sizeof(struct s), 2, pf);
printf("%s %d %lf", s.name, s.age, s.score);
fclose(pf);
return 0;
}
运行结果: