版权声明:本文为小斑马伟原创文章,转载请注明出处!
一、文件api的分类
01)文件读写api
fgetc fputc 按照字符读写文件
fputs fgets 按照行读写文件 (读写配置文件)
fread fwirte 按照块读写文件 (大数据块迁移)
fprintf 按照格式化进行读写文件
fprintf(fp, "%s = %s\n", pKey, pValue);
02)文件控制api
文件是否结束
文件指针的定位、跳转
fseek(fp, 0L, SEEK_END); //把文件指针从0位置开始,移动到文件末尾
//获取文件长度;
length = ftell(fp);
fseek(fp, 0L, SEEK_SET);
03)api做项目
二、标准文件的读写
1.文件的打开fopen()
文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头。
fopen(char filename,char type);
其中filename是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。而type参数表示了对打开文件的操作方式。其可采用的操作方式如下:
方式 含义
"r" 打开,只读
"w" 打开,文件指针指到头,只写
"a" 打开,指向文件尾,在已存在文件中追加
"rb" 打开一个二进制文件,只读
"wb" 打开一个二进制文件,只写
"ab" 打开一个二进制文件,进行追加
"r+" 以读/写方式打开一个已存在的文件
"w+" 以读/写方式建立一个新的文本文件
"a+" 以读/写方式打开一个文件文件进行追加
"rb+" 以读/写方式打开一个二进制文件
"wb+" 以读/写方式建立一个新的二进制文件
"ab+" 以读/写方式打开一个二进制文件进行追加
当用fopen(0成功的打开一个文件时,该函数将返回一个FILE指针,如果文件打开失败,将返回一个NULL指针。如想打开test文件,进行写:
FILE *fp;
if((fp=fopen("test","w"))==NULL)
{
printf("File cannot be opened\n");
exit();
} else {
printf("File opened for writing\n");
……
fclose(fp);
}
2.关闭文件函数fclose()
文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。
int fclose(FILE *stream);
它表示该函数将关闭FILE指针对应的文件,并返回一个整数值。若成功地关闭了文件,则返回一个0值,否则返回一个非0值。常用以下方法进行测试:
if(fclose(fp)!=0)
{
printf("File cannot be closed\n");
exit(1);
} else {
printf("File is now closed\n");
}
当打开多个文件进行操作,而又要同时关闭时,可采用fcloseall()函数,它将关闭所有在程序中打开的文件。
int fcloseall();
该函数将关闭所有已打开的文件,将各文件缓冲区未装满的内容写到相应的文件中去,接着释放这些缓冲区,并返回关闭文件的数目。如关闭了4个文件,则当执行:n=fcloseall(); 时,n应为4。
3.按照字符读文件
include<stdio.h>
int fgetc(FILE* stream);
功能:从stream指定的文件中读取一个字符
参数:stream:文件指针
返回值:成功:返回读取到字符 失败:-1
FILE* fp = fopen("D://a.txt", "r");
if (fp == NULL) {
printf("打开文件失败\n");
return -1;
}
printf("文件打开成功:%p\n", fp);
char ch;
while ((ch = fgetc(fp)) != EOF) {
printf("%c", ch);
}
fclose(fp);
文件结尾:在C语言中,EOF表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的行驶存放。
3.按照字符写文件
int fputc(int ch,FILE* stream);
功能:讲ch转换为unsigned char 后写入stream指定的文件中
参数:ch:需要写入文件的字符 stream:文件指针
返回值:成功:成功写入文件的字符 失败:返回-1
feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用判断文本文件。
int feof(FILE *stream)
功能:检测是否读取到了文件结尾。判断的是最后一次”读操作的内容"不是当前位置内容(上一个内容)
参数:stream:文件指针
返回值:非0值:已经到文件结尾 0:没有到文件结尾
FILE* fp = fopen("D:/a.txt", "w");
if (!fp) {
printf("文件打开失败\n");
return -1;
}
char ch;
while(1){
scanf("%c", &ch);
if (cj == '@') {
break;
}
fputc(ch, fp);
}
fclose(fp);
4.文件加密和解密
int main(void) {
FILE* fp1 = fopen("D://解密.txt", "r");
FILE* fp2 = fopen("D://加密.txt", "w");
if (!fp1 || !fp2) {
return -1;
}
char ch;
while ((ch = fgetc(ch, fp1)) != EOF) {
ch++;
//加密
fputc(ch, fp2);
}
fclose(fp2);
fclose(fp1);
system("pause");
return 0;
}
int main(void) {
FILE* fp1 = fopen("D://解密.txt", "r");
FILE* fp2 = fopen("D://加密.txt", "w");
if (!fp1 || !fp2) {
return -1;
}
char ch;
while ((ch = fgetc(ch, fp1)) != EOF) {
ch--;
//解密
fputc(ch, fp2);
}
fclose(fp2);
fclose(fp1);
system("pause");
return 0;
}
5.文件行读操作
功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出换行字符、读到文件结尾或是已读了size-1个字符为止,最后会自动加上'\0'作为字符串结束。
参数:str:字符串 size:指定最大读取字符串的长度(size-1) stream:文件指针
返回值:成功:成功读取的字符串 读到文件尾或出错:NULL
fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也作为字符串的一部分。通过scanf和gets输入一个字符串的时候,不包含结尾的"\n",但通过fgets结尾多了"\n"。fgets()函数是安全的,不存在缓冲区溢出的问题。
FILE* fp = fopen("D://a.txt", "r");
if (!fp)
return -1;
char* p = (char*)malloc(sizeof(char)* 100);
//feof(文件指针) 判断文件是否到结尾 可以判断文本文件也可以判断二进制文件
//如果到文件结尾返回值为 非0的值
//如果没有到文件结尾返回值为 0
while (!feof(fp)) {
memset(p, 0, 100);
fgets(p, 100, fp);
printf("%s\n", p);
}
free(p);
fclose(fp);
5.文件行写操作
功能:将str所指定的字符串写入到stream指定的文件中,字符结束符'\0'不写入文件。
参数:str 字符串 stream 文件指针,如果把字符串输出到屏幕,固定写为stdout
返回值:成功 0 失败 -1
fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'
FILE* fp = fopen("D:/d.txt", "w");
if (!fp)
return -1;
char ch[] = "你哈哈哈";
fputs(ch, fp);
fclose(fp);
system("pause");
键盘输入 写入文件中
FILE* fp = fopen("D://B.txt", "w");
if (!fp)
return -1;
char* p = (char*)malloc(sizeof(char)* 1024);
while (1) {
memset(p, 0, 1024);
//fgets()
scanf("%[^\n]", p);
//吞噬回车\n
getchar();
//停止输入命令 comm = exit
if (!strcmp(p, "comm=exit"))
break;
//追加\n
strcat(p, "\n");
fputs(p, fp);
}
free(p);
fclose(fp);
6.四则运算文件行写操作
enum opt {
add,sub,mlt,dive
}op;
int main() {
srand((size_t)time(NULL));
FILE* fp = fopen("D://四则运算.txt", "w");
if (!fp) {
return -1;
}
int a, b;
char c;//+ - * /
char* p = (char*)malloc(sizeof(char)* 20);
for (int i = 0; i < 100; i++) {
a = rand() % 10 + 1;
b = rand() % 10 + 1;
switch (rand()%4)
{
case add: c = '+';
break;
case sub: c = '-';
break;
case mlt: c = '*';
break;
case dive: c = '/';
break;
default:
break;
}
memset(p, 0, 20);
printf(p, "%d%c%d=\n", a, c, b);
fputs(p, fp);
}
free(p);
fclose(fp);
system("pause");
return 1;
}
6.四则运算文件行读操作
FILE* fp1 = fopen("D:/四则运算.txt", "r");
FILE* fp2 = fopen("D:/四则运算结果.txt", "w");
if (!fp1 || !fp2) {
printf("打开文件失败\n");
return -1;
}
int a,b,sum;
char c;
char* p = (char*)malloc(sizeof(char)*20);
for (int i = 0; i < 100; i++) {
memset(p, 0, 20);
fgets(p,20,fp1);
sscanf(p, "%d%c%d=\n", &a, &c, &b);
switch (c) {
case '+':sum = a + b; break;
case '-':sum = a - b; break;
case '*':sum = a * b; break;
case '/':sum = a / b; break;
}
memset(p, 0, 20);
sprintf(p, "%d%c%d = %d\n", a, c, b, sum);
fputs(p, fp2);
}
free(p);
fclose(fp1);
fclose(fp2);
return 0;