有効な電子メールと無効な電子メールの両方を含むテキストファイルで有効な電子メールアドレスを検索するプログラムを作成しました。
&次に、有効な電子メールを別のテキストファイルに出力します。
私が抱えている問題は、@記号の左側の行を読み取り、複数の「。」がある場合はtrueを読み取るサブストリングまたはオブジェクトを作成することです。
例:このテキスト行を有効な電子メールとして読んでください-Jimmy.Cole@yahoo.com
&
もっと'。'がある場合 @記号がfalseとして読み取られた後。これが私のコードです:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
const string DEFAULT_INPUT_FILENAME="fileContainingEmails.txt";
const string DEFAULT_OUTPUT_FILENAME="copyPasteMyEmails.txt";
const int N=1000; //assuming atmost 1000 email
//function prototypes
bool isNotDuplicateEmail(string emails[], int emailCount, string emailTemp);
bool isValidEmail(string emails[], string emailTemp);
void WriteToFile(string emails[], int emailCount, string outputFile);
void DisplayEmailsToConsole(string emails[], int emailCount);
bool isValidEmailChar(char c);
int countOccurenceOfAt(string emailTemp);
int countOccurenceOfDot(string emailTemp);
int main()
{
//variable declaration
ifstream fin;
string inputFile;
string outputFile;
int emailCount=0;
string emails[N];
//ask user for input and output file name
cout<<"Enter input file name: ";
getline(cin,inputFile);
cout<<"Enter output file name: ";
getline(cin,outputFile);
//check for default names
if(inputFile=="")
inputFile=DEFAULT_INPUT_FILENAME;
if(outputFile=="")
outputFile=DEFAULT_OUTPUT_FILENAME;
cout<<"Input File Name = "<<inputFile<<endl;
cout<<"Output File Name = "<<outputFile<<endl;
//open input file
fin.open(inputFile.c_str());
//if file does not exists, display error message and return
if(!fin)
{
cout<<"ERROR: "<<inputFile<<" doen not exists."<<endl;
return 1;
}
string emailTemp;
/*read each line from file, and if it is not a duplicate email and a valid email
then add it to email list and increment count*/
while(getline(fin,emailTemp))
{
if(isNotDuplicateEmail(emails,emailCount,emailTemp) && isValidEmail(emails,emailTemp))
{
emails[emailCount]=emailTemp;
emailCount++;
}
}
//close input file
fin.close();
//call function to write emails to output file and console
if(emailCount>0)
{
WriteToFile(emails, emailCount, outputFile);
cout << endl << emailCount << " email addresses were found, and copied to the file " << outputFile<<endl;
DisplayEmailsToConsole(emails, emailCount);
}
else
{
cout << "Sorry, no email addresses were found in the file " << inputFile << endl;
}
cout << endl<< "Press ENTER to continue..." << endl;
cin.get();
return 0;
}
bool isNotDuplicateEmail(string emails[], int emailCount, string emailTemp)
{
/*Check each email address and if a duplicate email is found, return false*/
/*If email is not a duplicate email, return true*/
for(int i=0;i<emailCount;i++)
{
if(emailTemp==emails[i])
return false;
}
return true;
}
bool isValidEmail(string emails[], string emailTemp)
{
if(emailTemp=="")
return false;
/*If there are more than 1 @*/
if (countOccurenceOfAt(emailTemp)!=1)
return false;
/*If there are more than 1 .*/
if(countOccurenceOfDot(emailTemp)!=1)
return false;
int index1=-1;
int index2=-1;
//check each character for valid email char
for (int i=0; i<emailTemp.size(); i++)
{
if(!isValidEmailChar(emailTemp[i]))
return false;
}
//find index of @ and .
index1=emailTemp.find_first_of('@');
index2=emailTemp.find_first_of('.');
if(index1<1)
return false;
if(index2<index1)
return false;
if((index2-index1)==1)
return false;
if(((emailTemp.size()-1)-index2)==0)
return false;
return true;
}
bool isValidEmailChar(char c)
{
/* check for valid email characters 0-9, @, ., A-Z, a-z, _, +, - */
if(c>='0' && c<='9')
return true;
if(c>='A' && c<='Z')
return true;
if(c>='a' && c<='z')
return true;
if(c=='@' || c=='.' || c=='_' || c=='+' || c=='-')
return true;
return false;
}
/*Function to count occurence of @ in email address*/
int countOccurenceOfAt(string emailTemp)
{
int count=0;
for(int i=0;i<emailTemp.size();i++)
{
if(emailTemp[i]=='@')
count++;
}
return count;
}
/*Function to count occurence of . in email address*/
int countOccurenceOfDot(string emailTemp)
{
int count=0;
for(int i=0;i<emailTemp.size();i++)
{
if(emailTemp[i]=='.')
count++;
}
return count;
}
void DisplayEmailsToConsole(string emails[], int emailCount)
{
/*Display console message and then display each email address, one at a line*/
cout << endl << endl << "You can open the output file and copy/paste its contents into the \"to\", \"cc\", or \"bcc\" field of any email message. It is best to use the \"bcc\" field so that everyone's email address does not appear in the message, to protect their privacy"<<endl;
cout << endl << "Email List is: "<< endl;
for (int i=0; i<emailCount; i++)
{
cout << emails[i] << endl;
cout << endl;
}
}
void WriteToFile(string emails[], int emailCount, string outputFile)
{
/*Open file and write each email address to output file followed by ; */
ofstream fout;
fout.open(outputFile.c_str());
for(int i=0; i<emailCount; i++)
{
fout << emails[i] << "; " << endl;
}
//close file
fout.close();
}