从 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++;
}
}
}
我必须使用堆栈和队列从我的作业的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++;
}
}
}