从文本文件中读取两列

时间:2014-03-31 20:51:43

标签: c++

string dictionary;
ifstream in;
in.open("Q3.dic");
while(!in.eof())
{
    getline(in, dictionary);
    cout << dictionary <<endl;
}

这就是我用来读取如下文本文件的内容:

you     vous
today       aujourd'hui
good        bon
good morning    bonjour
afternoon   après-midi
good evening    bonsoir
much        beaucoup
is      est

注意:英文短语通过制表符与法语翻译分开。

我要知道的是,是否可以将每列读取为两个不同的变量?

我试过了:

in >> english >> french;
cout << english << french <<endl;

但我遇到的问题是有三个单词的行。

2 个答案:

答案 0 :(得分:2)

std::getline()接受第三个参数 - delim - 分隔符,如果你为第一个调用指定为'\t'(tab),你应​​该得到你想要的结果:< / p>

std::ifstream in("Q3.dic");

for (std::string english, french;
    std::getline(in, english, '\t') && std::getline(in, french);
    )
{
    std::cout << "English: " << english << " - French: " << french
        << std::endl;
}

对于那些包含多个标签的行,您需要trim the string,但我声明这不属于这个问题的范围!

输出:

English: you - French:  vous
English: today - French:        aujourd'hui
English: good - French:         bon
English: good morning - French: bonjour
English: afternoon - French: après-midi
English: good evening - French: bonsoir
English: much - French:         beaucoup
English: is - French:   est

答案 1 :(得分:1)

我认为你想使用像std::map<std::string,std::string>这样的东西,你可以用一个词作为特定语言的关键词(请阅读评论中的解释):

std::map<std::string,std::string> dictionary;
ifstream in;
in.open("Q3.dic");

std::string line;
while(getline(in, line)) { // Read whole lines first ...
    std::istringstream iss(line); // Create an input stream to read your values
    std::string english; // Have variables to receive the input
    std::string french;  // ...
    if(iss >> english >> french) { // Read the input delimted by whitespace chars
        dictionary[english] = french; // Put the entry into the dictionary.
                                      // NOTE: This overwrites existing values 
                                      // for `english` key, if these were seen
                                      // before.
    }
    else {
       // Error ...
    }
}

for(std::map<std::string,std::string>::iterator it = dictionary.begin();
    it != dictionary.end();
    ++it) {
    std::cout << it->first << " = " << it->second << std::endl;
}

查看代码的Live Working Sample


根据我在代码注释中的注释,您可能已经注意到可能需要处理非唯一english -> french翻译。在某些情况下,字典中的一个english关键字可能会有多个关联的翻译。

你可以克服这个,或者像这样宣布你的字典

std::map<std::string,std::set<std::string>>> dictionary;

std::multi_map<std::string,std::string> dictionary;