标签: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 }
标签:style blog color io os ar 使用 for sp
原文地址:http://www.cnblogs.com/linrong/p/4046584.html