从txt文件读取字符串并在c ++

时间:2016-02-13 10:21:01

标签: c++ stack queue palindrome istringstream

我必须使用堆栈和队列来检查它是否是我的作业的txt文件中的回文。

************ Txt文件**************

我说过你永远不会说"永远不会说永远不会"?你说我做了。

我说过你永远不会说"永远不会"?

你很高兴你是国王吗?

金,你很高兴你是国王吗?

落叶后落叶。

妈妈说,"你做什么?" - 你做妈妈说的话。

妈妈说,"你做什么?" - 你做妈妈做的事。

你知道,我没有为你做过什么,因为我很少认识你。

你知道,我没有为你做过什么,因为我很少认识你。

第一夫人统治国家。

埃舍尔,画手,画画。

你可以吞下一只燕子,不能吗?

第一夫人统治国家,并陈述规则:"女士第一"。

他们相信自己很幸福是有福的。

你可以吞下一只燕子,但是你可以吞下笼子,对吗?

关注自己的事业:拥有自己的想法。

骑马,骑马,骑马,骑马,骑马,骑马,骑马!

咔哒咔哒,嘎嘎嘎嘎,嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎。

关注自己的事业。

一个人,一个人一个人!

埃舍尔伸出双手,画了埃舍尔。

假装每行之间没有空格。 因此,在第一行之后,没有空行,第二句话如下。

我使用istringstream在第一行停止,但输出有错误。由于某种原因,每个句子的最后一个单词打印出两次。

这是我的代码,

void getData(Stack<string> &s, Queue<string> &q)
{
    ifstream readFile;
    string temp;
    string temp1;
    Stack<string> a[24];
    Queue<string> b[24];
    int j = 0;
    //int b = 0;

readFile.open("test_word_plndrms.txt");

if(!readFile)
{
    cout << "Error opening the file" << endl;
    exit(1);
}
else {
    while(!readFile.eof()) {
            getline(readFile, temp);
            for (size_t i = 0; i < temp.length(); ++i) {
                if (ispunct(temp[i]))
                    temp.erase(i--, 1);
                if(isupper(temp[i]))
                    temp[i] = tolower(temp[i]);
            }
        istringstream ss(temp);
            while(ss) {
                ss >> temp1;
                cout << temp1 << endl;
                a[j].push(temp1);
                b[j].enqueue(temp1);
            }
        j++;

    }

}

}

这是我的输出,

做 一世 说 您 决不 说 决不 说 决不 您 说 一世 没有 没有 没有 一世 说 您 决不 说 决不 决不 是 您 高兴 您 是 王 王 王 是 您 高兴 您 是 王 王 秋季 树叶 后 树叶 秋季 秋季 说 妈妈 什么 做 您 做 您 做 什么 妈妈 说 说 说 妈妈 什么 做 您 做 您 做 什么 妈妈 不 不 您 知道 一世 没有 小 对于 您 对于 小 没有 一世 知道 您 您 您 知道 一世 没有 小 对于 您 以来 小 没有 一世 知道 您 您 第一 女士们 规则 该 州 州 埃舍尔 画画 手 德鲁 手 画画 画画 您 能够 笼 一个 吞 斜面 您 您 第一 女士们 规则 该 州 和 州 该 规则 女士们 第一 第一 幸福 是 他们 那 相信 他们 是 幸福 幸福 您 能够 笼 一个 吞 斜面 您 但 您 斜面 吞 一个 笼 能够 您 您 心神 您的 拥有 商业 拥有 您的 心神 心神 骑着车 和 骑着车 和 骑着车 和 骑着车 和 骑着车 和 骑着车 和 骑着车 骑着车 哒 和 哼 和 紧缩 和 紧缩 和 哼 和 哒 哒 心神 您的 拥有 商业 商业 所有 对于 一 和 一 对于 所有 所有 埃舍尔 画画 手 德鲁 手 画画 埃舍尔 埃舍尔 程序以退出代码结束:0

我要做的是阅读第一行,并将每个单词如&#34;&#34; &#34; I&#34; &#34;说&#34; &#34;你&#34; &#34;从未&#34; &#34;说&#34; &#34;从未&#34; &#34;说&#34; &#34;从未&#34; &#34;你&#34; &#34;说&#34; &#34; I&#34; &#34;做&#34;并将它们推送到堆栈并排队。 然后,弹出每个字符串,如果弹出的字符串不同,它不是回文句子,如果全部相同,那就是回文句子。

有人可以给我这个家庭作业的任何建议吗?谢谢。

2 个答案:

答案 0 :(得分:3)

它打印最后一个单词两次的原因是因为声明:

while(ss)
{
   ...
}

while循环需要额外的循环,因为ss仍然有效。 您可以清除它并检查temp1是否为空。

while (ss)
{
    ss >> temp1;

    if (temp1.empty())
    {
        break;
    }

    cout << temp1 << endl;
    a[j].push(temp1);
    b[j].enqueue(temp1);
    temp1.clear();
}

答案 1 :(得分:1)

你的while循环执行了一个额外的循环,因为它错误地检查是否存在CURRENT字(已经在前一个循环中打印过)。它应该检查是否存在要打印的NEXT字。因此,我改变了while循环的条件。

void getData (Stack<string> &s, Queue<string> &q) {

    ifstream readFile;
    string temp;
    string temp1;
    Stack<string> a[24];
    Queue<string> b[24];
    int j = 0;

    readFile.open("test_word_plndrms.txt");

    if (!readFile) {
        cout << "Error opening the file" << endl;
        exit(1);
    }
    else {
        cout << "Reading file" << endl << endl;
        while (!readFile.eof()) {
            getline(readFile, temp);
            for (size_t i = 0; i < temp.length(); ++i) {
                if (ispunct(temp[i])) {
                    temp.erase(i--, 1);
                }
                if (isupper(temp[i])) {
                    temp[i] = tolower(temp[i]);
                }
            }
            cout << "Finished reading line #" << j+1 << ":" << endl;
            istringstream ss(temp);

            while (ss.peek() != EOF) {
                ss >> temp1;
                cout << temp1 << ' ';
                a[j].push(temp1);
                b[j].enqueue(temp1);
            }
            cout << endl << endl;
            j++;
        }
    }
}