如何使用C ++中的struct向向量添加新行

时间:2016-12-06 00:13:53

标签: c++

您好,我遇到了最终项目的问题。目标是让用户创建一个表单,允许用户以编码格式查看数据,编辑数据,添加数据和保存他们的密码数据。程序以用户输入的文件开头。分隔符是';',第一个字符是“代码”,然后是网站,用户名,密码和注释。

我对矢量很新,我不允许使用二维数组或地图。

感谢您的时间。

 #include <iomanip>
#include <cmath>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

const int MAX_SIZE = 30;
const int BUFFER_SIZE = 200;

struct dataRow {
    string site, user, pass, notes;
    string code;
};

string inFileName; //name of inputfile  
string outFileName;
ifstream pathStream;
ofstream outFile;
char inputChar;
int extPosition(1), count = 0,lineNum;

void displayVector(vector<dataRow> inputData);
void viewLineData(vector<dataRow> inputData, int lineNum);
void addNewRow(vector<dataRow> inputData,int& lastRowNum, string site, string user, string pass, string notes);
void editLineData(vector<dataRow> inputData, int& lineNum, string site, string user, string pass, string notes);
void warning();
void cleanBuffer();
bool displayMenu();
int exit();
dataRow descripLine;
int main()
{
    vector<dataRow> inputData;

    string rowDescripin,userin,passin,notesin,sitein;
    string codein,errorMsg;
    int lastRow;
    //add a .txt extension to the file if the user didn't provide an extension
    if (inFileName.size() > 4)
        // If there's a valid extension, it will be in the last 4 positions of the string; Adjust by 1 for 0 offset
        extPosition = inFileName.size() - 4;
    int ext = inFileName.find_last_of(".txt");
    if (!(inFileName.find_last_of(".") == extPosition))
    {
        inFileName += ".txt";
    }

    cout << "\nPlease enter the filename of input file: ";
    cin >> inFileName;

    pathStream.open(inFileName.c_str());
    if (pathStream.fail())
    {
        cerr << inFileName << " failed to open.\n";
        system("pause");
        exit(1);
    }
    else
    {
        cout << "startup success" << endl;

    }
        getline(pathStream, codein, ';');
        descripLine.code = codein;
        while (!pathStream.eof())
        {
            getline(pathStream, sitein, ';');
            descripLine.site = sitein;

            getline(pathStream, userin, ';');
            descripLine.user = userin;

            getline(pathStream, passin, ';');
            descripLine.pass = passin;

            getline(pathStream, notesin, ';');
            descripLine.notes = notesin;

            inputData.push_back(descripLine);

        }
        displayVector(inputData);
        displayMenu();
        while (cin){
            cin >> inputChar; 
            inputChar = toupper(inputChar);

            //Adjust calculations based on inputCHar
            if (inputChar == 'D')  // Display line descriptions
            {    
                displayVector(inputData);
            }
            else if (inputChar == 'V')  //View line data
            {
                cout << "Enter line number you wish to view: ";
                cin >> lineNum;
                viewLineData(inputData, lineNum);
            }
        /*  else if (inputChar == 'E')  //Edit line Data
            {
                cout << "Enter line number you wish to edit: ";
                cin >> lineNum;
                editLineData(inputData, lineNum);
            }*/
            else if (inputChar == 'A')  //Add line data
            {
                warning();
                lastRow = inputData.size();
                cout << "Enter a line description: ";
                cin >> rowDescripin;

                cout << "Enter a line username: ";
                cin >> userin;

                cout << "Enter a line password: ";
                cin>>passin;

                cout << "Enter notes: ";
                cin>>notesin;

                addNewRow(inputData, lastRow, rowDescripin, userin, passin, notesin);
            }
            /*else if (inputChar == 'S')  //Save and encode file
            {
            }*/
            else if (inputChar == 'X')  //exit program
            {
                exit();
            }
        }
        system("pause");
    }
bool displayMenu()
{
        cout << endl << "           AVAILABLE OPTIONS           " << endl << endl <<
            "D - DISPLAY LINE DESCRIPTIONS" << endl <<
            "V - VIEW LINE DATA" << endl <<
            "E - EDIT LINE DATA" << endl <<
            "A - ADD LINE DATA" << endl <<
            "S - SAVE AND ENCODE FILE" << endl <<
            "X - EXIT PROGRAM" << endl;
        return 0;
}
void viewLineData(vector<dataRow> inputData,int lineNum)
{

        cout << inputData[lineNum].site << endl << inputData[lineNum].user<<endl<<inputData[lineNum].pass <<endl<<inputData[lineNum].notes; 

}
void displayVector(vector<dataRow> inputData)
{
    cout << fixed << setprecision(3);

    for (unsigned int i = 0; i < inputData.size(); i++)
    {   
        cout << left << setw(20) << inputData[i].site ;
    }  
}
void addNewRow(vector<dataRow> inputData, int& lastRowNum, string site, string user, string pass, string notes)
{
    char ans;
    cout << "You have entered:" << endl << site << endl << user << endl << pass << endl << notes<<endl;
    cout << "Is this the data you wish to add (Y/N)? ";
    cin >> ans;
    ans = toupper(ans);
    if (ans == 'Y')
    {
        dataRow tempRow = { site, user, pass, notes };
        inputData.push_back(tempRow);
        cout << inputData.size();
        int num = inputData.size()-1;
        for (unsigned int i = 0; i < inputData.size(); i++)
        {
            cout << inputData[i].site << endl << inputData[i].user << endl << inputData[i].pass << endl << inputData[i].notes;
        }

    }
    else if (ans == 'N')
    {
        cout << "ok enter of no";
    }
}

void warning()
{
    cout<< "WARNING: You cannot use semi-colons in these fields. Any semi-colons entered will be removed." << endl;
    return;
}
int exit()
{
    pathStream.close();
    system("pause");
    return 0;
}
void cleanBuffer()
{
    cin.clear();
    cin.ignore(BUFFER_SIZE, '\n');
}

0 个答案:

没有答案