1

我必须编写一个程序,从文件中提取电子邮件地址并将其放入另一个文件中。我不知道如何让程序将信息放入另一个文件。另外,我是否必须像创建第一个文件一样创建第二个文件?这是我到目前为止所拥有的:

#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;
}
4

4 回答 4

1

问题是提取应该在while ()循环的表达式部分完成。此外,您“找到电子邮件地址”的部分是无用的表达。您应该使用它作为在输出文件中插入有效电子邮件地址的条件:

while (inFile >> mail)
{
    if (mail.find('@') != std::string::npos)
        outFile << mail;
}

在您的原始代码中,您使用了std::cin >> mail. 您对电子邮件地址已存储在输入文件流中的问题的描述给我留下了深刻的印象。如果这种情况,您不应该使用std::cin而是inFile执行提取。我做了上面的更正。


这里有一些关于代码质量的建议。你不应该using namespace std在你的代码中使用。去掉它。这被认为是一种不好的做法。相反,您应该使用std::.

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;
              });
}
于 2013-10-15T23:47:12.093 回答
0

电子邮件地址往往很复杂。您最初查找所有互联网电子邮件域地址的方法会让您受益匪浅,因为它们具有以下形式,

name@sub.sub.sub.domain.tld

其中顶级域 (TLD) 是一组相当广泛的值(com、net、edu、gov、us、uk、le、ly、de、so、ru、...)。最近 IANA 宣布取消对 TLD 值的限制,因此您将很快看到新 TLD 的爆炸式增长(apple、ibm、dell、att、cocacola、shell ......)。

名称部分可以是字母、数字和某些特殊字符。

您可能会发现使用正则表达式模式匹配库将帮助您提取电子邮件地址。

这里有一些参考资料会有所帮助,

以下是 Wikipedia 给出的一些有效电子邮件地址的示例,

niceandsimple@example.com
very.common@example.com
a.little.lengthy.but.fine@dept.example.com
disposable.style.email.with+symbol@example.com
user@[IPv6:2001:db8:1ff::a0b:dbd0]
"much.more unusual"@example.com
"very.unusual.@.unusual.com"@example.com
postbox@com (top-level domains are valid hostnames)
!#$%&'*+-/=?^_`{}|~@example.org
"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
 üñîçøðé@example.com (Unicode characters in local part)
et cetera

从文件中提取一个(或多个)电子邮件地址后,您需要将每个电子邮件地址写入您的输出文件。假设 emaddr 包含一个有效的地址,

cout<<emaddr<<endl;  //std::cout, std::endl if you don't 'using namespace std'

以免我们忘记,还有其他寻址方案,您可能想了解一下,

等等

于 2013-10-16T00:08:23.977 回答
0

以下代码(来自http://www.cplusplus.com/doc/tutorial/files/)显示了如何写入文件:

// basic file operations
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream myfile;
  myfile.open ("example.txt");
  myfile << "Writing this to a file.\n";
  myfile.close();
  return 0;
}

将此应用于您的情况,您需要在循环中写入输出文件的一行。“文件”实际上只是一个不同的“流”,就像控制台一样。您可能已经知道如何使用std::cout- 写入文件几乎完全相同......

于 2013-10-15T23:47:27.620 回答
0

我不确定您希望您的程序如何工作,但大致如下是您在 C++ 中读写文件的方式:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    // Declare output file variable
    std::ofstream myFile;

    // Open/create text file
    myFile.open("myDocument.txt");

    // Check if it's opened correctly (ie, not in use)
    if(myFile.is_open())
    {
        // Write to the file
        myFile << "Line one.\n";
        myFile << "Line two.\n";
        // Close the file after use
        myFile.close();
    }
    else
    {
        // Output an error if we can't open it
        std::cerr << "Could not open file.";
    }

    // Declare input file variable
    std::ifstream readFile;

    // Open this
    readFile.open("myDocument.txt");

    // Check if it opened (ie, not in use)
    if(readFile.is_open())
    {
        // Temp variable to hold read lines
        std::string temp;

        // While not at the end of the document, get the line and store it in temp variable
        while(std::getline(readFile, temp))
        {
            // Output that line to the console
            std::cout << temp << "\n";
        }
        // Close the file
        readFile.close();
    }
    else
    {
        // Print an error if we couldn't open the file
        std::cerr << "Could not open file.";
    }

    return 0;
}
于 2013-10-15T23:48:16.437 回答