一,文件的打开与关闭过程
在使用文件时要先用fopen函数打开文件,应注意,应用文件指针进行打开操作,而在使用完毕后用fclose关闭文件,这是文件的打开与关闭,是必要的操作
FLIE* pa=fopen("test.txt","r");//参数r表示从文件中读取操作
fclose(pa);//关闭文件
注意:使用相对路径打开文件test.txt,不带盘符,但使用这种方法此文件必须要跟程序存储在一个路径下。例如:当前程序在D:\soft文件夹中,而文件必须也在D:\soft目录下否则不可以使用相对路径,必须使用绝对路径。例如:当前程序在D:\soft文件夹中,而文件在D:\text文件夹中,必须使用绝对路径,而在这是,文件中的路径应写为D:\\text\\test.txt,因为“\”在C语言中要使用转义字符,要用“\\”表示,即代码试下
FILE* pa=fopen("D:\\text\\test.txt","r");
fclose(pa);
二,文件的操作的基本八大函数
1,fputc函数的使用
fputc函数用于从文件中写入一个字符,但不可以一次写入多个字符串
#include<stdio.h> #include<stdlib.h> int main() { int a = 10000; char b[15] = "zhujunhao"; FILE* pr=fopen("E:\\text\\test1.txt","w"); if (pr == NULL) { printf("兔子兔子"); exit(0); } fputc(a,pr);//此数不可以用b,因为fput(a,pr);a只能是一个字符 fputc('j', pr);//不能添加字符串 fputc('h', pr); fclose(pr); pr = NULL; return 0; }
2,fgetc函数的使用
fgetc函数用于从文件中读取一个字符,但不可以一次读取字符串
#include<stdio.h> #include<stdlib.h> int main() { FILE* pa =fopen("E:\\text\\test1.txt","r"); printf("%c", fgetc(pa));//fgetc(pa)从文件中的第一个开始读取,先从第一个读取 printf("%c", fgetc(pa));//fgetc(pa)从文件中自动读取第二个,即自动指向下一个读取 printf("%c", fgetc(pa));//fget(pa)从文件中自动读取第三个 fclose(pa); pa = NULL; return 0; }
3,fputs函数的使用
fputs函数可以将一串字符串输出到文件中,与fputc的主要区别在于fputs可以输出字符串
#include<stdio.h> #include<stdlib.h> int main() { FILE* pr = fopen("E:\\text\\test2.txt", "w"); char a[15] = "aaa"; if (pr == NULL) { printf("吃兔子"); exit(0); } fputs(a,pr);//fputs可以添加许多个,fputc只能添加一个有关字符或者数 fputs("zhujunhao", pr);//fputs可以添加字符串也可以添加字符,fputc只能添加字符 fclose(pr); pr = NULL; return 0; }//总结:对于fputs比fputc更为高级,最好用fputs,可助记为s为字符串,c为字符
4,fgets函数的使用
fgets函数是从文件中读取一串字符串,fgets(arr,n,pa),表示从文件pa中最多得到n个字符存储到arr中
#include<stdio.h> #include<stdlib.h> int main() { char arr[50]; FILE* pr = fopen("E:\\text\\test1.txt","r"); if (pr == NULL) { printf("兔子"); exit(1); } fgets(arr, 50, pr); //在fgets中,第一个arr是将pr中读取的放到arr中,第二个50指最多读取50个数,第三个pr指从pr中读取 printf("%s", arr);//注意:这里最多只能读取一行,若要读取第二行应在用一次fgets(arr, 50, pr); //第一行数据结束后后有字符\n,所以在读取中也把\n读取到里面了,第二次可不用加\n即自动换行 fclose(pr); pr = NULL; return 0; }
5,fprintf函数的用法
fprintf函数的操作如下
#include<stdio.h> #include<stdlib.h> int main() { int a = 666, b = 999; char arr[50] = "tuzi"; FILE* pa = fopen("E:\\text\\test2.txt", "w"); if (pa == NULL) { printf("兔子"); exit(1); } fprintf(pa, "%d %s %d", a, arr, b);//将a,arr,b全部输出到pa所指向的文件中 fclose(pa); pa = NULL; return 0; }
此函数用于将数据写入文件
6,fscanf函数的用法
#include<stdio.h> #include<stdlib.h> int main() { char ar[100]; int a, b; FILE* pa = fopen("E:\\text\\test1.txt", "r"); if (pa == NULL) { printf("兔子"); exit(1); } fscanf(pa, "%s %d %d", ar, &a, &b); //从文件中输入ar,a,b这三个数据,但是文件中必须有这三个类型的数据 printf("%s %d %d", ar, a, b); fclose(pa); pa = NULL; return 0; }
用于读取文件中的数据
7,fwrite和fread函数的用法
函数的形式:
fwrite(a,size,count,pa);
fread(a,size,count,pa);
函数的功能:
fread()函数从文件pa中读取count个长度为size字节的数据块,将其存放到a中,同时从文件开始位置向后移动count*size个字节。fwrite()函数与之相同,与之不同的是fwrite是向文件中写入的操作
函数返回值:
对于fread: 如果fread函数读取成功时,如果没有读取完或者刚好读取完文件的数据时,函数的返回值是count的数值,如果读取的字节已经超过文件的数据时,将会返回读取完文件数据时count的值
对于fwrite: 如果fwrite函数写入成功时,将会返回实际所写入的字段数count,如果返回值小于count,说明操作发生了错误
fread运用的实例:
#include<stdio.h> #include<stdlib.h> int main() { char a[500],b[500]; FILE* pa = fopen("E:\\text\\test2.txt", "r");//文件数据为abcdefg数据长度为7 if (!pa) { perror("兔子"); exit(1); } //对于fread和fwrite函数返回值,若其中写入或读入的数已经超出文件数据中的最后一个时,则返回的值会是读或写入时最大的n值 printf("%d\n", fread(a, sizeof(char), 2, pa));//将2个char大小的数据读入a中,即两个字符,返回值为2 printf("%c\n", a[0]);//此时a[n]={'a','b'}; printf("%d\n", fread(b, 4, 1, pa)); //此时b[n]={'c','d','e','f'},共四个,在用完fread或fwrite后文件指向会自动移动 for (int i = 0; i < 4; i++) printf("%c", b[i]); //不要用puts(b),以为fread和fwrite是用于二进制文件,puts会把乱码打印出来 fclose(pa); pa = NULL; return 0; }
fwrite运用的实例
#include<stdio.h> #include<stdlib.h> int main() { FILE* pa = fopen("E:\\text\\test2.txt", "w"); if (!pa) { perror("兔子"); exit(1); } char a[5] = { '1','2','3','4','5'}; fwrite(a, sizeof(char), 1, pa); //只将第一个字符'1'写入进去了,此时文件中数据为1 fwrite(a, sizeof(a), 1, pa); //将数组a全部元素写入进去了,因为sizeof(a)即为全部元素所占的内存大小 fclose(pa);//此时文件中数据为11234 pa = NULL; return 0; }
三,stdin和stdout的标准用法
stdin是标准输入流,指从键盘中输入,与scanf函数用法相似
stdout指从键盘中输出,与printf函数用法相似
例如:
#include<stdio.h> int main() { int ch = fgetc(stdin);//stdin指从键盘中输入,stdin是标准输入流,即键盘 fputc(ch,stdout);//stdout指从键盘中输出,stdin是标准输出流,即屏幕 return 0; }
四,5大函数fseek,ftell,rewind,feof,perror的使用方法以及注意事项
1,fseek函数的使用,用于随意将指向文件中的数据
#include<stdio.h> #include<stdlib.h> int main() { FILE* pa = fopen("E:\\text\\test3.txt", "r");//文件中的数据为123456789abcdef if (!pa) { puts("兔子"); exit(1); } fseek(pa, 1, SEEK_SET); //pa是文件指针,1表示偏移1个数据(刚开始指向首个字符)即偏移量 printf("%c", fgetc(pa)); //其中,SEEK_SET是指向开始位置,SEEK_END指向最后一个位置,SEEK_CUR指向当前的位置 fclose(pa); pa = NULL; return 0; }//注意:对于fseek(pa,0,SEEK_END)为最后一个字符,偏移量不能为正数
2,ftell和rewind函数的使用,ftell返回与起始位置的偏移量,rewind返回文件的起始位置
#include<stdio.h> #include<stdlib.h> int main() { FILE* pa = fopen("E:\\text\\test3.txt", "r");//文件中是123456789abcdef长度为15 if (!pa) { puts("兔子"); exit(1); } fseek(pa, 0, SEEK_END); //若是偏移量是-1,如果没有fgetc()的话ftell(pa)输出为14,即倒数第二个,以为fgetc()会往前偏移一个单位 printf("%c\n", fgetc(pa));//fgetc()会得到前面的一个数据,即自动往下一个偏移 printf("%d\n", fgetc(pa)); printf("%d\n", ftell(pa)); rewind(pa);//将文件指向数据的起始位置 printf("%d",ftell(pa)); fclose(pa); pa = NULL; return 0; }
3,feof函数和perror函数的用法,perror用来错误报错函数,feof判断在文件读取结束的时候,是读取失败还是遇到文件末尾结束
#include<stdio.h> #include<stdlib.h> int main() { char c; FILE* pa = fopen("E:\\text\\test1.txt", "r");//文件里面为987654321 if (!pa) { perror("兔子");//输出“兔子: No such file or directory”表示错误 exit(1); } while ((c = fgetc(pa)) != EOF)//从文件开始循环到文件结束 putchar(c);//putchar函数输出字符时不换行 //注意,不能用以下用法 /*while(fgetc(pa)!=EOF) puttchar(fgetc(pa));*/ //因为一遇到fgetc函数就会跳向下一个字符 if (ferror(pa))//若读写错误返回非零,读写正确返回0值 perror("\n错误"); if (feof(pa))//如果当前位置在文件结尾(即EOF)返回非零,否则返回0值 puts("\n成功"); return 0; }