http://oj.ecustacm.cn/problem.php?id=1331
题解:
主要考察对文件的读取操作。
文件的读写操作详解
我们先将这三个文件 1.txt 2.txt 3.txt 弄好弄到桌面上。
这样方便fopen在读取的时候不需要写路径了。
记得将文件内的逗号换成空格这样方便读取。
用map来映射操作十分的方便
#include<cstdio>
#include<map>
#include<iostream>
using namespace std;
int main(void)
{
FILE *f1;
f1=fopen("1.txt","r");
FILE *f2;
f2=fopen("2.txt","r");
FILE *f3;
f3=fopen("3.txt","r");
if(!f1&&!f2&&f3)
{
printf("没有打开");
}
char number[50];
map<string,int>mp;
while(fscanf(f1,"%s",&number)!=EOF)
{
mp[number]=1;
}
while(fscanf(f2,"%s",&number)!=EOF)
{
mp[number]++;
}
while(fscanf(f3,"%s",&number)!=EOF)
{
if(mp[number]!=0)
//把在3中出现的,且在1或2也出现的重置为0 表示为1,2中未在3出现的
{
mp[number]=0;
}
}
int sum=0;
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++)
{
if(it->second==2)
sum++;
}
printf("%d\n",sum);
return 0;
}
或者用数组,不过前提是 把前面多余的零替换成空格
#include<stdio.h>
int main()
{
FILE *fp,*fp1,*fp2;
long long arry[400];
long long arry1[400];
long long arry2[400];
long long arry3[400];
long long number;
int len1=0,len2=0,len3=0,len4=0;
int i=0,j=0;
int num=0,num1=0;
fp=fopen("A.txt","r");//A文件
fp1=fopen("B.txt","r");//B文件
fp2=fopen("C.txt","r");//C文件
while(fscanf(fp,"%lld",&number)!=EOF)//把A文件的数存储到arry数组
{
arry[len1++]=number;
}
while(fscanf(fp1,"%lld",&number)!=EOF)//把B文件的数存储到arry1数组
{
arry1[len2++]=number;
}
while(fscanf(fp2,"%lld",&number)!=EOF)//把C文件的数存储到arry2数组
{
arry2[len3++]=number;
}
for(i=0;i<len1;i++)
{
for(j=0;j<len2;j++)
{
if(arry[i]==arry1[j])
{
arry3[len4++]=arry[i];//把A,B文件的相同的数存储到arry3数组
num++;//A,B共有个数
}
}
}
for(i=0;i<len4;i++)
{
for(j=0;j<len3;j++)
{
if(arry3[i]==arry2[j])
{
num1++;
}
}
}
printf("%d",num-num1);//属于A,B但不属于C
fclose(fp);
return 0;
}