文件操作
一、文件指针
在C语言中,规定了文件的结构体FILE。
FILE *fp;
二、文件的打开和关闭。
打开:fopen(文件名,打开的方式);
通常来说,打开文件失败原因有3个:
1、用r来打开一个空文件。
2、指定的盘符或者路径不存在。
3、文件名包含一些奇怪的字符。 123/.txt
4、有些文件被其他程序占用。
r | 只读(普通文件) |
w | 只写(普通文件) |
a | 追加(普通文件) |
r+ | 读和写(普通文件) |
w+ | 读和写(普通文件) |
a+ | 读和追加(普通文件) |
rb | 只读(二进制文件) |
wb | 只写(二进制文件) |
ab | 追加(二进制文件) |
rb+ | 读和写(二进制文件) |
wb+ | 读和写(二进制文件) |
ab+ | 读和追加(二进制文件) |
关闭:fclose(fp); 不关闭文件容易产生数据的流失。
1 //----------------------------------------------打开和关闭文件 2 #include <stdio.h> 3 4 int main() 5 { 6 FILE *fp; //定义一个文件指针 7 8 if ((fp = fopen("123.txt", "w")) == NULL) //打开一个文件 9 { 10 printf("文件打开失败!\n"); 11 exit(0); 12 } 13 14 fclose(fp); 15 return 0; 16 }
三、文件的读写
1、fputc(ch,fp) 向文件中写入字符(写)
1 //======================================写字符fputc(ch,fp); 2 #include <stdio.h> 3 4 int main() 5 { 6 FILE *fp; //定义一个文件指针 7 char ch; //定义字符变量 8 9 if ((fp = fopen("123.txt", "w")) == NULL) //打开一个文件 10 { 11 printf("文件打开失败!\n"); 12 exit(0); 13 } 14 15 printf("请输入字符:"); 16 ch = getchar(); 17 18 while (ch != '#') 19 { 20 fputc(ch, fp); 21 ch = getchar(); 22 } 23 24 fclose(fp); 25 return 0; 26 }
2、fgetc(fp) 从文件中获取字符(读) 这个函数在遇到文件结尾的时候,返回一个EOF。
1 //==================================读字符:fgetc(fp); 2 #include <stdio.h> 3 4 int main() 5 { 6 FILE *fp; 7 char ch; 8 9 if ((fp = fopen("123.txt", "a+"))==NULL) //只写 10 { 11 printf("文件打开失败!\n"); 12 exit(0); 13 } 14 15 while ((ch = fgetc(fp)) != EOF) //文件的结尾 EOF 16 { 17 putchar(ch); 18 } 19 20 fclose(fp); 21 return 0; 22 }
(2) fputs(str,fp); 写入字符串
1 //=写字符串:fputs(str,fp); 2 #include <stdio.h> 3 4 int main() 5 { 6 FILE *fp; 7 char filename[100], str[100]; 8 9 printf("请输入文件名称\n"); 10 scanf("%s", filename); 11 12 if ((fp = fopen(filename, "a+")) == NULL) 13 { 14 printf("打开文件失败!"); 15 exit(); 16 } 17 18 printf("输入字符串:"); 19 20 getchar(); 21 gets(str); //从键盘输入 22 23 fputs(str, fp); 24 fclose(fp); 25 return 0; 26 }
fgets(str,字节数,fp); 读出字符串 包括’\0’
1 //读字符串:fgets(str,字节数,fp); 2 #include <stdio.h> 3 4 int main() 5 { 6 FILE *fp; 7 char filename[100], str[100]; 8 9 printf("请输入文件名称\n"); 10 scanf("%s", filename); //123.txt 11 12 if ((fp = fopen(filename, "a+")) == NULL) 13 { 14 printf("打开文件失败!"); 15 exit(); 16 } 17 18 fgets(str,6,fp); 19 20 puts(str); 21 22 fclose(fp); 23 return 0; 24 }
//=======fprintf(fp,"%s",str)
1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *fp; 6 char filename[100], str[100] = "Meung Python"; 7 8 printf("请输入文件名称\n"); 9 scanf("%s", filename); //123.txt 10 11 if ((fp = fopen(filename, "a+")) == NULL) 12 { 13 printf("打开文件失败!"); 14 exit(); 15 } 16 17 fprintf(fp, "%s", str); 18 19 fclose(fp); 20 return 0; 21 }
fprintf(fp,"%s",str)
fscanf(fp,"%d",&i)这两种读写 一定要注意空格 逗号。
1 //fscanf(fp,"%d",&i) 2 #include <stdio.h> 3 4 int main() 5 { 6 FILE *fp; 7 char filename[100], str[100],str1[100],str2[100]; 8 9 printf("请输入文件名称\n"); 10 scanf("%s", filename); //123.txt 11 12 if ((fp = fopen(filename, "a+")) == NULL) 13 { 14 printf("打开文件失败!"); 15 exit(); 16 } 17 18 fscanf(fp, "%s %s %s", str, str1, str2); 19 20 printf("%s,%s,%s", str, str1, str2); 21 22 fclose(fp); 23 return 0; 24 }
fread(str, 17, 2, fp);从fp指向的文件中读取字符,每次读取17个字符,一共读取2次。字符串需要补’\0’
1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *fp; 6 char filename[100], str[100] = {0}; 7 8 printf("请输入文件名称\n"); 9 scanf("%s", filename); //123.txt 10 11 if ((fp = fopen(filename, "a+")) == NULL) 12 { 13 printf("打开文件失败!"); 14 exit(0); 15 } 16 17 18 fread(str, 5, 3, fp); //17不包括字符串 19 printf("%s", str); 20 21 return 0; 22 }
Fwrite(buffer,size,count,fp)从字符串往文件写 size大小,写count次。
1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *fp; 6 char filename[100], str[100] =" Is everyone here taday"; 7 8 printf("请输入文件名称\n"); 9 scanf("%s", filename); //123.txt 10 11 if ((fp = fopen(filename, "a+")) == NULL) 12 { 13 printf("打开文件失败!"); 14 exit(0); 15 } 16 17 18 fwrite(str, 3, 6, fp); //17不包括字符串 19 //printf("%s", str); 20 21 return 0; 22 }
Fseek(fp,偏移量,起始点) //偏移量是常量 最好是加一个L
起始点: 文件头(0) 当前位置(1) 文件尾(2)
偏移量:比如:起始点是0,偏移量为23L,从文件头开始往后边移动文件内部指针20个字节。
起始点是2,偏移量为-20L,从文件尾开始往前边移动文件内部指针20个字节。
1 //====fseek(fp,偏移量,起始点) 2 #include <stdio.h> 3 4 int main() 5 { 6 FILE *fp; 7 char filename[100], str[100] = {0}; 8 9 printf("请输入文件名称\n"); 10 scanf("%s", filename); //123.txt 11 12 if ((fp = fopen(filename, "a+")) == NULL) 13 { 14 printf("打开文件失败!"); 15 exit(0); 16 } 17 18 fseek(fp, 16L, 0); 19 fread(str, 5, 1, fp); 20 printf("%s", str); 21 22 fseek(fp, -5L, 1); 23 fread(str, 5, 1, fp); 24 printf("%s", str); 25 26 27 28 fseek(fp, 8L, 1); 29 fread(str, 2, 1, fp); 30 printf("%s", str); 31 32 //printf("%s", str); 33 return 0; 34 }
rewind(fp);把文件指针重新指向文件头
1 //==ftell(fp) 返回一个与文件头的偏移量 2 //计算我们输入的字符长度 3 #include <stdio.h> 4 5 int main() 6 { 7 FILE *fp; 8 int num; 9 10 char filename[100], ch; 11 12 printf("请输入文件名称\n"); 13 scanf("%s", filename); //123.txt 14 15 if ((fp = fopen(filename, "a+")) == NULL) 16 { 17 printf("打开文件失败!"); 18 exit(0); 19 } 20 21 22 ch = fgetc(fp); 23 while (ch!=EOF) 24 { 25 putchar(ch); 26 ch = fgetc(fp); 27 } 28 29 num = ftell(fp); 30 printf("%d", num); //63 31 32 return 0; 33 }
1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *fp; 6 int num; 7 8 char filename[100], str[100] = {0}; 9 10 printf("请输入文件名称\n"); 11 scanf("%s", filename); //123.txt 12 13 if ((fp = fopen(filename, "a+")) == NULL) 14 { 15 printf("打开文件失败!"); 16 exit(0); 17 } 18 19 fseek(fp, 16L, 0); //16 20 fread(str, 5, 1, fp); //5 21 printf("%s", str); 22 23 num = ftell(fp); 24 printf("\n%d\n", num); 25 26 27 fseek(fp, -5L, 1); 28 fread(str, 5, 1, fp); 29 printf("%s", str); 30 31 num = ftell(fp); 32 printf("\n%d\n", num); 33 34 rewind(fp); //文件内部指针重新指向文件头 35 36 fseek(fp, 8L, 1); 37 fread(str, 6, 1, fp); 38 printf("%s", str); //lrldgo 39 40 num = ftell(fp); 41 printf("\n%d\n", num); //14 42 43 //printf("%s", str); 44 return 0; 45 }
总结:
fopen(filename,打开的方式)
fclose(fp)
fputc(ch,fp)
fgetc(fp)
fputs(str,fp)
fgets(buf,size,fp) //size包含'\0'
fprintf(fp,"%s%d%f%c",a,b,c,d)
fscanf(fp,"%s %d %f %c",a,&b,&c,&d) //注意格式 空格,逗号
fread(buf,size,count,fp) //需要补上 '\0'
fwrite(buf,size,count,fp)
fseek(fp,偏移量,起始点) 起始点包括 0 1 2 偏移量为常量时加L
ftell(fp) 计算文件内部指针相对于文件头的偏移量。这个偏移量也是这个函数的返回值。
1、尝试去操作二进制文件。
2、希望做一个通过文件操作,结合前面的知识来写一个界面优美,功能齐全的什么什么系统。