im not sure why the code for the variable known. its always doubling 2 times. the code is suppose to display the times processed valid card invalid cards and unknown cards. the known cards are the ones that are american express discover visa and master. im trying to get the count of them but it seems like they are always doubling for some reason
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void validateCC(string);
string checkCC(string, int, bool&);
bool validateCCNum(string);
string setCCType(string);
int proc = 0, valid = 0 , invalid = 0 , unknown = 0 , known = 0;
void main() {
string cardnum[300];
int ccLen;
ifstream openfile("Sample Credit Card numbers.txt");
if (openfile.is_open())
{
while(!openfile.eof())
{
for (int count = 0; !openfile.eof(); count++)
{
getline(openfile,cardnum[count]);
ccLen = cardnum[count].length();
cout<<"sdfsd";
proc++;
if (ccLen !=0)
{
validateCC(cardnum[count]);
}
}
}
cout<<valid<<" valid\n";
cout<<invalid<<" invalid\n";
cout<<unknown<< " unknwon\n";
cout<<proc<<" processed\n";
system("Pause");
}
}
void validateCC(string ccn) {
string msg;
bool OK;
int ccLen;
ccLen = ccn.length();
msg = checkCC(ccn, ccLen, OK);
if(!OK)
{
cout <<ccn<< msg << "\n";
invalid++;
}
else
{
if(validateCCNum(ccn))
{
msg = setCCType(ccn);
setCCType(ccn);
valid++;
cout<<ccn<<msg << "Card Type\n";
}
else
{
cout << (ccn)<<" Invalid"<< " credit card number\n";
invalid++;
}
}
}
string checkCC(string c, int cLen, bool& ccOK) {
string s = "";
ccOK = true;
for(int i=0;i<cLen && ccOK;++i)
ccOK = isdigit(c[i]);
if(ccOK == false) {
s = " Invalid credit card number digits";
} else if(cLen == 15) {
if(c.substr(0, 2) != "34" && c.substr(0, 2) != "37") {
ccOK = false;
s = " Invalid American Express credit card number";
}
} else if(cLen != 16) {
ccOK = false;
s = " Invalid credit card number length";
}
return s;
}
bool validateCCNum(string cc) {
bool flip = true;
int tmp, num = 0, ccLen = cc.length()-1;
for(int ndx=ccLen;ndx>=0;ndx--) {
if (flip)
num += cc[ndx] - '0';
else {
tmp = (cc[ndx] - '0') * 2;
if(tmp <= 9)
num += tmp;
else
num += (1 + (tmp - 10)); // max of 18
}
flip = !flip;
}
return num % 10 == 0;
}
string setCCType(string cc) {
int num = cc[0]-'0';
int num1 =cc[1]-'0';
int num2 = cc[2]-'0';
int num3 = cc[3]-'0';
string cct = " Unknown";
if(cc.length()==15 &&num ==3 &&num1 ==4|| cc.length()==15 &&num ==3 &&num1 ==7)
{
cct = " American Express";
known++;
}
else if(num == '4')
{
cct = " Visa";
known++;
}
else if(num ==5 && num1 ==1 ||num ==5 && num1 ==2|| num ==5 && num1 ==3||num ==5 && num1 ==4|| num ==5 && num1 ==5)
{
cct = " MasterCard";
known++;
}
else if (num == 6 && num1 ==0 && num2 == 1 && num3==1 || num ==6 && num==5)
{
cct = " Discover"; //ignoring other prefixes
known++;
}
else
{
unknown++;
}
return cct;
}
You are calling the function twice. This counts the
known/unknowntwice.