C语言编程题目(3)文件类型操作
题目:
0x01 比较两个文本文件并打印出它们第一个不相同的行(文件每行字符数不多于80)。
0x02 文本文件num1.txt和num2.txt中各有一组用空格分隔的整数,将num1.txt和num2.txt联合排序,并将结果保存在num3.txt中,例如图1所示。
0x04 检查C源程序的圆括号和大括号是否匹配。正确的例子如:({((…)(…))}()),不正确的例子如:{(})。
代码1:
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 FILE *fp1,*fp2; 6 char buf1[1024]; 7 char buf2[1024]; 8 fp1=fopen("1.txt","r+"); 9 fp2=fopen("2.txt","r+"); 10 if (fp1 == NULL||fp2 ==NULL) { 11 perror("Open file error!\n"); 12 exit(1); 13 } 14 while(1) 15 { 16 fgets(buf1,80,fp1); //文件1.txt 读出一行 17 fgets(buf2,80,fp2);//文件2.txt 读出一行 18 if(strcmp(buf1,buf2) != 0) //内容不一样 19 { 20 printf("1.txt:%s2.txt:%s",buf1,buf2); 21 break; 22 } 23 if(strlen(buf1) == 0 && strlen(buf2) == 0){ //文件内容完全一样,无不一样的行 24 printf("The two files is the same complete. Read Done!\n"); 25 break; 26 } 27 memset(buf1,0,sizeof(buf1)); 28 memset(buf2,0,sizeof(buf2)); 29 } 30 fclose(fp1); 31 fclose(fp2); 32 return 0; 33 }
运行结果1:
代码2:
1 #include <stdio.h> 2 #include <stdlib.h> 3 void sort(int a[],int N); 4 int main(void) 5 { 6 FILE *fp1 = fopen("num1.txt", "r"); 7 FILE *fp2 = fopen("num2.txt", "r"); 8 FILE *fp3 = fopen("num3.txt", "w"); 9 int index = 0,i=0; 10 int array[1024]={0}; 11 if (fp1 == NULL || fp2==NULL ||fp3 == NULL) 12 { 13 perror("Open file recfile"); 14 exit(1); 15 } 16 while(!feof(fp1)){ 17 fscanf(fp1,"%d",&array[index]); //每次读出一个数据,填入数组 18 index += 1; 19 } 20 while(!feof(fp2)){ 21 fscanf(fp2,"%d",&array[index]); //每次读出一个数据,紧接着上次开始,填入数组 22 index += 1; 23 } 24 printf("index = %d\n",index); 25 while(i<index-1){ //打印数组所有元素 26 printf("%d\t",array[i]); 27 i+=1; 28 } 29 printf("\n"); 30 sort(array,index-1); //数组排序 31 i = 0; 32 while(i<index-1){ //再次打印数组所有元素 33 printf("%d\t",array[i]); 34 i+=1; 35 } 36 i = 0; 37 while(i<index-1){ //把数组数据格式化地写入文件 38 fprintf(fp3,"%d ",array[i]); 39 i += 1; 40 } 41 fclose(fp1); 42 fclose(fp2); 43 fclose(fp3); 44 return 0; 45 } 46 47 void sort(int a[],int N) //冒泡排序 48 { 49 int i,t,j; 50 for(i=0;i<N;i++) 51 { 52 for(j=0;j<N;j++) 53 { 54 if(a[j]>a[i]) 55 { 56 t=a[i]; 57 a[i]=a[j]; 58 a[j]=t; 59 } 60 } 61 } 62 }
运行结果2:
代码3:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 int main() 5 { 6 FILE *fp1 = fopen("db1.txt", "r"); 7 FILE *fp2 = fopen("db2.txt", "r"); 8 FILE *fp3 = fopen("db3.txt", "w"); 9 int index1=0,index2=0,i=0,j=0,k=0; 10 //name1 name2 指针数组将要分别存储文件1、2的姓名 11 //targetname 指针数组将要存储最后写入文件3的姓名 12 char *name1[10][10]={0},*name2[10][10]={0},*targetname[10][10]={0}; 13 //math_grade 存储文件1的数学成绩 egls_grade 存储文件2的英语成绩 14 //target_math(egls)_grade 第二次保存选择学生的数学成绩\英语成绩 15 //avg_grade 保存选择学生的平均成绩 16 int math_grade[10]={0},egls_grade[10]={0},target_math_grade[10]={0},target_egls_grade[10]={0},avg_grade[10]={0}; 17 if (fp1 == NULL || fp2==NULL ||fp3 == NULL) 18 { 19 perror("Open file recfile"); 20 exit(1); 21 } 22 while(!feof(fp1)){ //读文件1学生姓名、数学成绩 23 fscanf(fp1,"%s",name1+index1); 24 fscanf(fp1,"%d",&math_grade[index1]); 25 index1 += 1; 26 } 27 while(!feof(fp2)){ //读文件2学生姓名、英语成绩 28 fscanf(fp2,"%s",name2+index2); 29 fscanf(fp2,"%d",&egls_grade[index2]); 30 index2 += 1; 31 } 32 // //打印已保存信息 33 // while(i<index1-1){ 34 // printf("%s math grade:%d\n",name1+i,math_grade[i]); 35 // i += 1; 36 // } 37 // i = 0; 38 // while(i<index2-1){ 39 // printf("%s English grade:%d\n",name2+i,egls_grade[i]); 40 // i += 1; 41 // } 42 while( i < index1 - 1) //大循环来找重复的学生 43 { 44 j = 0; 45 //printf("Outer name1='%s'\n",name1+i); 46 while( j < index2 -1) 47 { 48 //printf("----->Inner name2='%s' \t",name2+j); 49 if(strcmp(name1+i,name2+j)==0) //学生名字重复出现 50 { 51 //printf("Match !\n"); 52 //依次填写名字、数学成绩、英语成绩、平均成绩信息到相应数组 53 strcpy(targetname+k,name1+i); 54 target_math_grade[k] = math_grade[i]; 55 target_egls_grade[k] = egls_grade[j]; 56 avg_grade[k] = 0.5*(math_grade[i]+egls_grade[j]); 57 k++; 58 break; //匹配成功马上结束内层循环 59 } 60 j++; 61 //printf("\n"); 62 } 63 i++; 64 } 65 i = 0; 66 while(i<k){ //循环写入文件三的信息 67 fprintf(fp3, "%s %d %d %d\n",targetname+i,target_math_grade[i],target_egls_grade[i],avg_grade[i]); 68 i += 1; 69 } 70 fclose(fp1); 71 fclose(fp2); 72 fclose(fp3); 73 return 0; 74 }
运行结果3:
代码4:
#include<stdio.h> #define True 1 #define False 0 char stack[1024]; //类似于栈 int top=-1; //栈顶指针,初始化为-1,表示空 int main() { char inputC; int success = True; while((inputC = getchar()) != '#') //输入字符以#结尾 { if(inputC == '(' || inputC == '{') stack[++top] = inputC; else if(inputC == ')') { if(top >= 0 && stack[top] == '(') top--; //弹栈 else{ //最内层不匹配马上结束循环,标志置位False success = False; break; } } else if(inputC == '}') { if(top >= 0 && stack[top] == '{') top--; //弹栈 else{ //最内层不匹配马上结束循环,标志置位False success = False; break; } } } if(success && top == -1) { printf("Match Success\n"); }else { printf("Match Error\n"); } return 0; }