文件学习

 1   FILE* fp;
 2     char ch,filename[10];
 3     printf("请输入所用的文件名:");
 4     scanf("%s",filename);
 5     if((fp = fopen(filename,"w"))== NULL)
 6     {
 7         printf("无法打开此文件");
 8         exit(0);
 9     }
10     ch = getchar();//存入scanf后的换行
11     printf("请输入一个准备存储到磁盘的字符串(以#结束)");
12     ch = getchar();
13     while(ch != '#')
14     {
15         fputc(ch,fp);
16         putchar(ch);
17         ch = getchar();
18     }
19     fclose(fp);
20     putchar(10);//输出一个换行符
21     return 0;

这是基本的文件打开与关闭,输出(fputc)得操作,自动创建文件创建在该程序源文件所在得文件夹下。因为可能打开失败,所以做一个if判断,如果失败可以及时跳出;C里面的输入要注意scanf是不吃回车的,要用getchar()吃掉

创建的文档类型是文件,如果想要创建的文件名有.txt后缀,那么创建的就是txt,也会自动匹配已经创建的txt文档

“w"是进行输出到文件,如果原来存在你想要输出的文件,那么,就会将原来的文件清空,再进行输出

”a"进行补充,在文件末尾继续输出,不会自动换行

输出到文件的可以是中文啊(真的厉害)如下这样就输出不了中文

   char ch = '';
   printf("qq%cqq",ch);

接下来联系一下fputc()和fgetc()

 1 void change_file(char changefilename[],char newfilename[])
 2 {
 3     FILE *fp1,*fp2;
 4     if((fp1 = fopen(changefilename,"r")) == NULL)
 5     {
 6         printf("无法打开此文件");
 7         exit(0);
 8     }
 9     if((fp2 = fopen(newfilename,"w")) == NULL)
10     {
11         printf("无法打开此文件");
12         exit(0);
13     }
14     char ch;
15     while(!feof(fp1))
16     {
17         ch = fgetc(fp1);
18         fputc(ch,fp2);
19         putchar(ch);
20     }
21     fclose(fp1);
22     fclose(fp2);
23 }

feof()函数可以检查文件读写位置(文件指针的指向)是否到了末尾,是为真(1),否为假(0)

接下来单个单个的字符拷贝太麻烦了,直接来个字符串的操作吧fgets(),fputs()

 1 void insert_stofile(char str[][10],int n,char filename[],char way[])
 2 {
 3     FILE *fp1;
 4     if((fp1 = fopen(filename,way)) == NULL)
 5     {
 6         exit(0);
 7     }
 8     for(int i = 0;i < n;i++)
 9     {
10         fputs(str[i],fp1);
11         fputs("\n",fp1);
12         puts(str[i]);
13     }
14 }

fputs()向文件写入字符串时要注意应人工分开所传入的字符串,方便只读时输入到计算机

 1 void read_sfromfile(char filename[],char way[])
 2 {
 3     FILE *fp;
 4     char str[10][10];
 5     int i = 0;
 6     if((fp = fopen(filename,way)) == NULL)exit(0);
 7     while(fgets(str[i],1024,fp) != NULL)
 8     {
 9         i++;
10     }
11     for(int j = 0;j < i;j++)
12     {
13         //puts(str[j]);//自动换行了,重复换行了,因为我把换行当作了,文件中字符的分割
14         printf("%s",str[j]);
15     }
16 }

fgets()成功返回str的地址,失败返回NULL

 

二进制方式的读写,常用于结构体

fread()

 1   FILE *fp ;
 2     fp = fopen("stofilesort.txt","ab+");
 3     char str2[100];
 4     int i;
 5 //    for(i = 0; i < 2;i++)
 6 //    {
 7 //        fread(&str2[i],1,2,fp);
 8 //        printf("i = %d\n",i);
 9 //    }
10     fread(&str2,2,1,fp);//注意在末尾添加结束标志
11     str2[2] = '\0';
12     printf("str2 = %s\n",str2);
13     fclose(fp);

fwrite()

1  char str[][10]={"def","abc","bcd"};
2     sort_string_xiao(str,3);
3     FILE *fp ;
4     fp = fopen("stofile.txt","wb+");
5     fwrite(str,10,3,fp);//注意在末尾添加结束标志
6     //将三维数组读入文件了
7     fclose(fp);

难点所在就是要注意size 与count的参数设定

两个函数成功后都返回coount

然后随机读写,要明白两个函数吧rewind(fp);使文件指针指向开头

fseek(fp,位移量,起始点)以起始点为基点,前为正方向,位移,数字末尾加L

起始点:0表示文件开头,1表示当前位置,2表示文件末尾

然后就多打一下代码训练训练吧~~

posted @ 2018-01-04 19:34  Butterflier  阅读(371)  评论(0编辑  收藏  举报