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

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

本文关键字:一行 C++ 读取 文件 txt 字符 字符串 串并      更新时间:2023-10-16

我必须使用堆栈和队列来检查它是否是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

我试图做的是阅读第一行,并将每个单词,例如"做了"我"说"你"从不"说"从不"说"从不"你"说">

我"做了"并将它们推到堆栈和队列中。然后,弹出每个字符串,如果弹出的字符串不同,它不是回文句子,如果都一样,它是一个回文句子。

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

它之所以两次打印最后一个单词是因为以下语句:

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 单词(已在上一个循环中打印(。它应该检查是否存在要打印的下一个单词。因此,我更改了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++;
        }
    }
}