首页 > 代码库 > 第十二天:C基础之文件操作

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

  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 = http://www.mamicode.com/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基础之文件操作