C++ 我是否在VS 2015中正确使用gets_s()?

C++ 我是否在VS 2015中正确使用gets_s()?,c++,C++,我是编程新手。我试图写一个程序,可以写的名称和打印文件名txt。我可以运行它,但它有一些问题 当我尝试输入信息时,有时它会自动移动到下一行。我认为这是由于gets_的功能,但我不确定这些问题是什么 我的代码如下: #include <iostream> #include <conio.h> #include <string.h> struct date { int day ,month, year; }; struct employee {

我是编程新手。我试图写一个程序,可以写的名称和打印文件名txt。我可以运行它,但它有一些问题

当我尝试输入信息时,有时它会自动移动到下一行。我认为这是由于gets_的功能,但我不确定这些问题是什么

我的代码如下:

#include <iostream>
#include <conio.h>
#include <string.h>

struct date
{
    int day ,month, year;
};
struct employee
{
    int ID;
    char name[100];
    date birthdate;
    char address[20];
    char rank[20];
    int money;
};

void Inputinformation(char *filename)
{
    char s[20];
    FILE *fp;
    errno_t err;

    err = fopen_s(&fp,filename, "ab");

    employee nv;
    std::cout<<"\nInput information of an employee:\n";
    std::cout<<"\tInput ID : ";
    std::cin >> nv.ID;
    fflush(stdin);
    std::cout<<"\tInput name : ";
    gets_s(s);
    gets_s(nv.name);
    std::cout<<"\tInput birthdate (Day Month Year ) : ";
    std::cin >> nv.birthdate.day >> nv.birthdate.month>> nv.birthdate.year;
    fflush(stdin);
    std::cout<<"\tInput address: ";
    gets_s(s);
    gets_s(nv.address);
    std::cout<<"\tInput rank : ";
    gets_s(s);
    gets_s(nv.rank);
    std::cout<<"\tMoney : ";
    std::cin >> nv.money;
    fwrite(&nv, sizeof(nv), 1, fp);

    fclose(fp);
}

void Show(char *filename)
{
    employee nv;

    FILE *fp;
    errno_t err;

    err = fopen_s(&fp,filename, "rb");

    std::cout<< "ID:", "NAME:", "BIRTHDATE", "ADDRESS:", "RANK:", "MONEY:";
    do
    {
        fread(&nv, sizeof(nv), 1, fp);
        if (feof(fp))
            break;
        std::cout<< nv.ID<<nv.name<<nv.birthdate.day<<nv.birthdate.month<< nv.birthdate.year <<nv.address<<nv.rank<<nv.money;
    } while (0 == 0);
    //Buoc 4 :Close
    fclose(fp);
}
//============================================================================
//SHow information of employee
void Show1(employee nv)
{
    std::cout << " " << nv.ID<<"\n";
    std::cout << nv.name<<"\n";
    std::cout<< nv.birthdate.day<<nv.birthdate.month<<nv.birthdate.year<<"\n";
    std::cout << nv.address<<"\n";
    std::cout << nv.rank<<"\n";
        std::cout << nv.money<<"\n";
}

void Findname(char *szName, char *szFilename)
{

        employee nv;
        int find = 0;
        // 1 :  file pointer
        FILE *fp;
        errno_t err;
        // 2 : Open file
        err = fopen_s(&fp,szFilename, "rb");

        if (fp == NULL)
        {
            std::cout << "\nfailed to open file!!!";
        }
        else
        {   // 3 : Read contend and show it
            do
            {
                fread(&nv, sizeof(nv), 1, fp);
                if (_stricmp(nv.name, szName) == 0)
                {
                    std::cout<< "ID:  NAME: BIRTHDATE: ADDRESS: RANK: MONEY:";
                    Show1(nv);
                    find = 1;
                    break;
                }
            } while (!feof(fp));
            //Buoc 4 :Close
            fclose(fp);
        }

        if (find == 0)
            printf("cant find this employee !!!");
    }

//===========================================================
void main()
{
    char filename[100] = "fool.txt";
    int i, n;
    int pick;
    employee dsnv[100];
    //Menu
    do
    {
        std::cout << "\n*********************************************";
        std::cout << "\n* 1.Input info of new employee           *";
        std::cout << "\n* 2. Print the list             *";
        std::cout << "\n* 3. Find the name of employee            *";
        std::cout << "\n* 4. Arrange the list by name             *";
        std::cout << "\n* 5. Exit                    *";
        std::cout << "\n*********************************************";

        std::cout << "\n\nWhat do you choose ?(1->5)";
        std::cin >> pick;

        switch (pick)
        {
        case 1:
            std::cout << "\nInput  n=";
            std::cin >> n;
            for (i = 0; i < n; i++)
                Inputinformation(filename);
            break;
        case 2:
            Show(filename);
            break;
        case 3:
            char nameofemployee[100];
            std::cout << "\Input name:";
            fflush(stdin);
            gets_s(nameofemployee);
            Findname(nameofemployee, filename);
            break;
        case 4:

            break;
        case 5:
            break;
        }
    } while (0 == 0);
}

在获取\u s之前使用fflushstdin。。。它将清除输入流,并调用gets_s。gets_s跳过的原因是,一些数据存在于先前输入的输入流中,这会填充gets_s,导致gets_s跳过并将输入流中的剩余数据作为输入。

请参阅。注意,这有点争议,但在Windows上可以正常工作。混合标准I/O,如GETSsS与C++流I/O,如STD:CIN > NV.金钱通常被认为是一个坏主意。谢谢人类。但是我该怎么修呢,伙计,我用过fget_s,getw_s,但是当我输入信息时,总会出现一个错误对话框。谢谢。但当我删除fflushstdin时,它仍然会发生同样的问题,如果你删除它,它会继续发生。所以,把它放在你的代码里。在得到时间之前使用fflushstdin