C++ 我是否在VS 2015中正确使用gets_s()?
我是编程新手。我试图写一个程序,可以写的名称和打印文件名txt。我可以运行它,但它有一些问题 当我尝试输入信息时,有时它会自动移动到下一行。我认为这是由于gets_的功能,但我不确定这些问题是什么 我的代码如下: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 {
#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