从 txt 文件中读取字符串并在 C++ 中的第一行停止

read strings from txt file and stop at first line in c++

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

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

我说过你从来没有说过"never say never"吗?你说我有。

我说过你从来没有说过"never"吗?

你很高兴你是国王吗?

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

落叶后落叶。

妈妈说,"What do you do?"-你照妈妈说的做。

妈妈说,"What do you do?"-你做妈妈做的事。

你知道,我为你做的很少,因为我不了解你。

你知道,我为你做的很少,因为我对你知之甚少。

第一夫人统治国家。

埃舍尔,画手,画手。

你能把燕子关在笼子里,不是吗?

第一夫人统治国家,并声明规则:"ladies first"。

相信自己是有福的人是有福的。

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

管好自己的事:拥有自己的想法。

骑,骑,骑,骑,骑,骑,骑,骑!

咔嗒声、嗡嗡声和嘎吱声,嘎吱声、嗡嗡声和咔哒声。

管好你自己的事。

一物一物,一物一物!

埃舍尔,画手,画手画埃舍尔。


假装每行之间没有空格 space。 所以,第一行之后没有空行,第二句紧随其后。

我使用 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

我想做的是读第一行,然后把每个词都写成 "did" "i" "say" "you" "never" "say" "never" "say" "never" "you" "say" "i" "did" 并将它们压入堆栈和队列。 然后对每个字符串进行pop,如果pop出来的字符串不同,则不是回文句,如果都相同,则为回文句。

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

最后一个字打印两次的原因是因为语句:

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();
}

你的 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++;
        }
    }
}