我正在尝试创建一个程序,它将从用户获取字符串并将它们存储在向量中。将它们存储在矢量中后,可以将它们显示,删除或打印到文件中。我正在创建程序的一部分,显示向量中的元素,但我似乎无法让它工作。 这是我的WIP:
#include <iostream>
#include <cctype>
#include <ctype.h>
#include <algorithm>
#include <string>
#include <math.h>
#include <windows.h>
#include <iomanip>
#include <vector>
#include <ostream>
#include <sstream>
#include <fstream>
#include <istream>
// common namespace
using namespace std;
int main()
{
start:int option;
cout << "Welcome to MyBook! - A text recorder framework application." << endl;
cout << "-----------------------------------------------------------" << endl;
cout << "Main Menu:" << endl;
cout << "1 - Add a book to the collection." << endl;
cout << "2 - Display all books currently in the collection." << endl;
cout << "3 - Remove a book from the collection." << endl;
cout << "4 - Write stored date to file." << endl;
cout << "5 - Quit" << endl;
cout << "Make your selection: ";
cin >> option;
vector<string> bookCollection;
string entryVal = " ";
string anotherOption;
**if (option == 1)
{
// add a book to the collection
cin.ignore();
enterbook:cout << "Add a book to the collection: ";
getline(cin, entryVal);
bookCollection.push_back(entryVal);
cout << "Would you like to enter another book?(1 - yes, 0 - no): ";
getline(cin, anotherOption);
//cout << "test";
if (anotherOption == "1")
{
goto enterbook;
}
else if (anotherOption == "0")
{
goto start;
}
}
else if (option == 2)
{
for (int i = 0; i < bookCollection.size(); i++)
cout << bookCollection[i] << " ";
}**
else if (option == 3)
{
// remove a book from the collection
}
else if (option == 4)
{
//write to file
}
else if (option == 5)
{
//Nested IF to kill program properly
int quitVar;
cout << "Are you sure you want to exit the program?: ";
cin >> quitVar;
if (quitVar == 1)
{
cout << "The program will now be terminated." << endl;
return 0;
}
else if (quitVar == 0)
{
cout << "Returning to the main menu." << endl;
goto start;
}
}
}
我的问题是:为什么我不打印bookCollection?或者更好的是,什么甚至存储在bookCollection中?
此外:有没有人有一些建议指出我正确的方向如何从我的矢量中删除元素,以及如何将我的矢量元素打印到文件?
答案 0 :(得分:1)
鉴于vector<string> bookCollection
,您可以使用ostream_iterator
将其内容转储到文件中,例如&#34; foo.txt&#34;:
copy(cbegin(bookCollection), cend(bookCollection), ostream_iterator<string>(ofstream("foo.txt"), "\n"))
您可以使用remove
删除元素,例如string entryVal
:
bookCollection.resize(bookCollection.size() - distance(remove(begin(bookCollection), end(bookCollection), entryVal), end(bookCollection));
答案 1 :(得分:1)
我的问题是:为什么我不打印bookCollection?或者更好的是,甚至存储在bookCollection中的是什么?
添加元素后,您正在跳转到start
(用户按下0后),它位于main()
的最顶部,它可能会导致您的矢量被清除并重新初始化。根据标准你的代码是正确的,但事实上你从收集在范围内的范围跳到不是c-tor和d-tor的地方:6.7 / 3(例如更令人讨厌):
可以转换为块,但不能以初始化绕过声明的方式。一个 程序从具有自动存储持续时间的变量不在范围内的点跳转到a 除非变量具有标量类型,具有普通默认值的类类型,否则它在范围内的点是不正确的 构造函数和一个普通的析构函数,这些类型之一的cv限定版本,或其中一个的数组 在没有初始值设定项的情况下声明前面的类型(8.5)。
[ Example:
void f() {
// ...
goto lx; // ill-formed: jump into scope of a
// ...
ly:
X a = 1;
// ...
lx:
goto ly; // OK, jump implies destructor
// call for a followed by construction
// again immediately following label ly
}
—end example ]
一旦您将start:
移到bookCollection
声明之下,您可能会在收藏中看到一些内容。但是 - 我强烈建议用普通的旧goto
循环替换while
。