码迷,mamicode.com
首页 > 其他好文 > 详细

第十二天:C基础之文件操作

时间:2014-10-23 20:33:35      阅读:394      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   使用   for   sp   

  C文件操作目前是用C库里面的函数,包括fwrite  fread  fgets fputs  getc  putc  fopen  fclose fseek  fgetline

  老刘讲这几个函数的时候,给了我们足够多的时间来研究这些函数。通过man命令来查看这些函数的数据手册。主要看几个方面第一个是传进去的参数,第二个是看函数的功能,第三个看函数的返回值。以后接触的函数会更多。不可能每个都要老师讲。所以查看手册,看懂意思是非常重要的。

    对于外部函数的使用,要注意对结果进行判断。使用perror函数,分析错误。

    从文件读内容的函数为:fwrite fgets getc  getline  

    fread 可以指定每次读多少数据 ,fgets每次读一串字符,getc 每次读一个字符 ,fgetline每次读一行。

     往文件写数据的函数为:fwrite ,fputs ,putc功能和上面的相反。

   打开和关闭函数fopen  fclose关于文件的操作都要用到这两个函数。

     fseek文件指针偏移函数 。第三个参数是偏移位置。有SEEK_SET SEEK_END SEEK_OUT SEEK_CUR

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     FILE * fp;
 6     if((fp = fopen("hello","r"))==NULL){
 7         perror("open");
 8         return 1;
 9     }
10 
11     int i = 0;
12     char c ;
13     for(i=0;i<5;i++){
14         c = getc(fp);
15         printf("%c",c);
16     }
17     printf("\n");
18     fseek(fp,0,SEEK_SET);
19     for(i=0;i<5;i++){
20         c = getc(fp);
21         printf("%c",c);
22     }
23     printf("\n");
24 
25 }

fgetline函数可以说是这里面最复杂的函数了。因为还涉及到二级指针和堆操作。晚上的作业就一道题目 。源文件中每一行有三个部分,学号,姓名,分数。要求将这些信息存到结构体中,进行排序后输出到文件。源文件中每个部分用tab键分开

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 struct person{
  5     char *number;
  6     char *name;
  7     int score;
  8 
  9 };
 10 int main()
 11 {
 12 /*    打开输入文件,创建输出文件。
 13  *
 14  */
 15     FILE *in = NULL;
 16     FILE *out =NULL;
 17     in = fopen("table","r");
 18     if(in==NULL){
 19         perror("open");
 20         return 1;
 21     }    
 22     out = fopen("sorttable","w");
 23     if(out==NULL){
 24         perror("open");
 25         return 1;
 26     }    
 27 /*
 28  *    截取line里面的内容存到指针数组里面
 29  *
 30  */
 31     char *line = NULL;
 32     size_t n;
 33     ssize_t len;
 34     char *p[20]={0};
 35     char *k[20]={0};
 36     int i = 0;
 37     int j = 0;
 38     while((len = getline(&line,&n,in))!=EOF){
 39         *(p+i) = malloc(len);//记得free
 40         for(j=0;;j++){
 41             if(*(line+j) == \n){
 42                 *(*(p+i)+j) = \0;
 43                  break;
 44             }
 45                 *(*(p+i)+j) = *(line+j);
 46         }    
 47         i++;
 48     
 49         *(k+i) = *(p+i);
 50 
 51     }
 52 /*
 53  *    将每行的内容按照\t截断成三分,存到二维数组中。
 54  *
 55  *
 56  */
 57     int m = i;
 58     char * src;
 59     char *tmp[3];
 60     struct person man[m];
 61     for(i=0;i<m;i++){
 62         for(j=0;j<3;j++){
 63             src = strstr(*(p + i),"\t");
 64             *(tmp+j) = strtok(*(p+i),"\t");
 65             *(p+i) = src + 1 ;
 66         }
 67         man[i].number = *(tmp+0);
 68         man[i].name = *(tmp+1);
 69         man[i].score = atoi(*(tmp+2));
 70     }
 71 /*
 72  *  用冒泡法对结构体数组进行排序
 73  *
 74  */
 75     struct person sttmp;
 76     for(i=0;i<m-1;i++){
 77         for(j=i+1;j<m;j++){
 78             if(man[i].score < man[j].score )
 79             {
 80                   sttmp = man[i];
 81                   man[i] = man[j];
 82                   man[j] =sttmp;            
 83             }
 84         }
 85     }
 86 /*
 87  * 将结果输出到文件。
 88  *
 89  */
 90     char show[20];
 91     for(i=0;i<m;i++){
 92         fputs(man[i].number,out);    fputs("\t",out);
 93         fputs(man[i].name,out);        fputs("\t",out);
 94         sprintf(show,"%d",man[i].score);
 95         fputs(show,out);        fputs("\n",out);
 96 
 97     }
 98     
 99 /*
100  *释放堆中的内容,关闭文件。
101  *
102  */
103     for(i=0;i<m;i++)
104         free(*(k+i));
105     if(line)
106         free(line);
107             
108     fclose(in);
109     fclose(out);
110 
111 }

 

 

 

 

 

 

 

 

第十二天:C基础之文件操作

标签:style   blog   color   io   os   ar   使用   for   sp   

原文地址:http://www.cnblogs.com/linrong/p/4046584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!