使用stringstream和ifstream将用户输入与文件中的单词进行比较

时间:2017-03-11 17:59:35

标签: c++ file fstream ifstream istringstream

我正在编写一个程序,用于将用户输入的句子与文件中的单词进行比较。我希望程序告诉我是否在文件中找到了句子中的任何单词。

我使用getline获取用户输入的句子然后我使用istringstream将句子切成单词并将每个单词与文件中的每个单词进行比较。我的方法是使用while循环遍历文件中的每个单词,并将用户输入的句子中的当前单词与文件中的当前单词进行比较。如果当前文件字与当前句子字相同,那么我将bool设置为true,否则我想跳到文件中的下一个字并将句子字与下一个文件字进行比较。

我不确定如何让istringstream和ifstream跳转到while循环中的下一个单词。我怎样才能迭代到下一个单词?

编辑:我需要在不使用矢量,数组等的情况下执行此操作。我最初的方法是使用矢量,但不允许这样做。

int main() {
    string sentence;
    string fileWord;

    cout << "Input your sentence : " << endl;
    getline(cin, sentence);

    istringstream iss(sentence);
    string sentenceWord;

    ifstream adjectiveFile;
    adjectiveFile.open("/project1.cpp/words/adjectives");

    while(iss >> sentenceWord && adjectiveFile >> fileWord) {
        if (sentenceWord == fileWord) {
            cout << "The word " << sentenceWord << " is in the file" << endl;
            bool adjectiveInSent = true;
        } else {

        }
    }

    adjectiveFile.close();

    return 0;
}

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

a)将文件中的单词存储在stl容器中  std::set<std::string>

b)阅读用户输入并使用std::istringstream将其解压缩    现在,对于每个单词,使用容器的find方法提取在a)中形成的地图中的简单搜索。

答案 1 :(得分:0)

可接受的c ++解决方案应如下所示:

int main() {
    string sentence;

    cout << "Input your sentence : " << endl;
    getline(cin, sentence);

    istringstream iss(sentence);
    std::set<string> lookUpWords;
    std::string word;
    while(iss >> word) {
        if(lookUpWords.find(word) != lookUpWords.end()) {
            lookUpWords.insert(word);
        }
    }

    ifstream adjectiveFile("/project1.cpp/words/adjectives");

    string fileWord;
    while(adjectiveFile >> fileWord) {

        if (lookUpWords.find(fileWord) != lookUpWords.end()) {
            cout << "The word " << sentenceWord << " is in the file" << endl;
        }
    }

    adjectiveFile.close();

    return 0;
}

至于你对限制的编辑,你可以在没有std::istringstream的情况下做到这一点(只要不是另一个愚蠢的限制你必须使用它):

int main() {
    string sentence;

    cout << "Input your sentence : " << endl;
    getline(cin, sentence);

    ifstream adjectiveFile("/project1.cpp/words/adjectives");

    string fileWord;
    while(adjectiveFile >> fileWord) {

        if (sentence.find(fileWord) != std::string::npos) {
            cout << "The word " << sentenceWord << " is in the file" << endl;
        }
    }

    adjectiveFile.close();

    return 0;
}

答案 2 :(得分:0)

这是仅使用流的解决方案。正如评论者指出的那样,它效率不高,但教师是教师,作业是作业。 ; - )

该算法适用于复合词。它不会像“fipfop”那样将“fip”与简单的string.find()匹配。

我只使用istringstream adjectiveFile来进行更简单的测试。当然,你可以用ifstream替换它。

#include <string>
#include <iostream>
#include <sstream>

using namespace std;

int main() {

    istringstream iss("bar fam fop fip");
    istringstream adjectiveFile("foo bar baz fup fam fiz fipfop");

    string fileWord, sentenceWord;
    while( adjectiveFile >> fileWord ) {
        iss.clear();    // clear EOF
        iss.seekg( 0 ); // start from beginning
        while( iss >> sentenceWord ) { 
            if (sentenceWord == fileWord) {
                cout << "The word " << sentenceWord << " is in the file" << endl;
            } 
        }
    }

    return 0;
}

Live Demo

<强>输出:

The word bar is in the file
The word fam is in the file