(1)比较两个文本文件并打印出它们第一个不相同的行(文件每行字符数不多于 80)。
(2)文本文件 num1.txt 和 num2.txt 中各有一组用空格分隔的整数,将 num1.txt 和
num2.txt 联合排序,并将结果保存在 num3.txt 中,例如图 1 所示。
(3)现有两个文本文件 db1.txt 和 db2.txt。db1.txt 中第一列为姓名,第二列为英语
成绩;db2.txt 中第一列为姓名,第二列为数学成绩。通过姓名字段将 db1.txt 文件关联到
db2.txt 文件生成 db3.txt 文件。db3.txt 文件第一列为姓名,第二列为英语成绩,第三列为
数学成绩,第四列为平均成绩,例如图 2 所示。
T1
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp1,*fp2;
int flag=0;
if( ((fp1=fopen("file1.txt","r"))==NULL) || ((fp2=fopen("file2.txt","r"))==NULL) )
{
printf("cannot open file\n");
return 0;
}
fp1=fopen("file1.txt","r");
fp2=fopen("file2.txt","r");
char line1[2000],line2[2000];
while(!feof(fp1)&&!feof(fp2))
{
fgets(line1,80,fp1);
fgets(line2,80,fp2);
if(strcmp(line1,line2)!=0)
{
printf("%s\n",line1);
printf("%s\n",line2);
flag=1;
break;
}
memset(line1,0,sizeof(line1));
memset(line2,0,sizeof(line2));
}
if(flag==0) printf("The two files are same");
fclose(fp1);
fclose(fp2);
}
T2
#include<stdio.h>
void sort(int a[],int N)
{
int i,t,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(a[j]>a[i])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
int main()
{
FILE *fp1=fopen("num1.txt","r");
FILE *fp2=fopen("num2.txt","r");
FILE *fp3=fopen("num3.txt","w");
if(fp1==NULL||fp2==NULL||fp3==NULL)
{
printf("cannot open file\n");
return 0;
}
int num[1000];
int index=0,i=0;
while(!feof(fp1))
{
fscanf(fp1,"%d",&num[index]);
index++;
}
while(!feof(fp2))
{
fscanf(fp2,"%d",&num[index]);
index++;
}
sort(num,index);
while(i<index)
{
printf("%d ",num[i]);
i++;
}
i=0;
while(i<index)
{
fprintf(fp3,"%d ",num[i]);
i++;
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
T3
#include<stdio.h>
#include<string.h>
struct stu{
char name[200];
int english;
int math;
int ave;
};
int main()
{
FILE *fp1=fopen("db1.txt","r");
FILE *fp2=fopen("db2.txt","r");
FILE *fp3=fopen("db3.txt","w");
if(fp1==NULL||fp2==NULL||fp3==NULL)
{
printf("cannot open file\n");
return 0;
}
int index1=0,index2=0;
struct stu stu1[20],stu2[20];
while(!feof(fp1))
{
fscanf(fp1,"%s",stu1[index1].name);
fscanf(fp1,"%d",&stu1[index1].english);
index1++;
}
while(!feof(fp2))
{
fscanf(fp2,"%s",stu2[index2].name);
fscanf(fp2,"%d",&stu2[index2].math);
index2++;
}
int i,j,k=0;
struct stu stu3[20];
for(i=0;i<index1;i++)
{
for(j=0;j<index2;j++)
{
if(strcmp(stu1[i].name,stu2[j].name)==0)
{
strcpy(stu3[k].name,stu1[i].name);
stu3[k].english=stu1[i].english;
stu3[k].math=stu2[j].math;
stu3[k].ave=(stu3[k].english+stu3[k].math)/2;
k++;
}
}
}
for(i=0;i<k;i++)
{
printf("%s %d %d %d\n",stu3[i].name,stu3[i].english,stu3[i].math,stu3[i].ave);
fprintf(fp3,"%s %d %d %d\n",stu3[i].name,stu3[i].english,stu3[i].math,stu3[i].ave);
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
memset(转载)
- memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,
c:是赋给buffer的值,
count:是buffer的长度.
这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer))
Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
例:char a[100];memset(a, ‘/0’, sizeof(a));
memset可以方便的清空一个结构类型的变量或数组。
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量:
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]=’/0’;
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);