我必须编写一个程序,从一个文件中提取电子邮件地址并将其放入另一个文件中。我不知道如何让程序将信息放入另一个文件。另外,我是否必须像创建第一个文件一样创建第二个文件?这是我目前所拥有的:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
char chr;
int main()
{
string mail;
ifstream inFile; //this is the file that we will get the information from
ofstream outfile; // this is the file that the data will be saved in
inFile.open("mail.dat"); // this will open the file with the original informations
outfile.open("addresses.dat"); // this will open the file where the output will be
while (inFile)
{
cin>>mail;
mail.find('@')!=string::npos; //this finds the email addresses
}
inFile.close(); // this will close the file when we are done with it
outfile.close();
cin>>chr;
return 0;
}
问题是提取应该在 while ()
循环的表达式部分完成。此外,您“找到电子邮件地址”的部分是无用的表达。您应该将其用作将有效电子邮件地址插入输出文件的条件:
while (inFile >> mail)
{
if (mail.find('@') != std::string::npos)
outFile << mail;
}
在您的原始代码中,您使用了 std::cin >> mail
。您对问题的描述给我的印象是电子邮件地址已经存储在输入文件流中。如果是这种情况,您不应使用std::cin
,而应使用inFile
来执行提取。我在上面做了更正。
这里有一些关于代码质量的建议。您不应在代码中使用 using namespace std
。去掉它。这被认为是一种不好的做法。相反,您应该使用 std::
限定所有标准 C++ 对象。
int main()
{
std::ifstream in;
std::ifstream out;
// ...
}
此外,两个标准文件流对象都有一个采用文件名的构造函数。您仍然可以使用 open
,但从构造函数实例化更方便:
int main()
{
std::ifstream in("mail.dat");
std::ofstream out("addresses.dat");
// ...
}
您还应该使用标准库算法来完成此类琐碎的事情。例如:
#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
int main()
{
std::ifstream in("mail.dat");
std::ofstream out("addresses.dat");
std::remove_copy_if(
std::istream_iterator<std::string>{in},
std::istream_iterator<std::string>{},
std::ostream_iterator<std::string>{out, "\n"}, [] (std::string str)
{
return str.find('@') != std::string::npos;
});
}
我是一名优秀的程序员,十分优秀!