我是C ++的新手(以及一般的编程)。我写了一个程序来读写员工的联系方式。这段代码效果很好:
// appropriate headers...
int main()
{
char trigger{};
int options = 0;
bool testing{};
fileIps Inptbox; // for entering new data
char ext_title[20]; char ext_intercomNum[4]; char ext_dept[20];
printf("%s", "Enter Officer's Title:\n");
gets_s(ext_title, 20);
printf("%s", "Enter Officer's Intercom Number:\n");
gets_s(ext_intercomNum, 4);
printf("%s", "Enter Officer's Department:\n");
gets_s(ext_dept, 20);
Inptbox.rcv_values(ext_title, ext_intercomNum, ext_dept);
Inptbox.create_string();
testing = Inptbox.validate();
if (testing == true)
return -1;
else if (testing == false)
Inptbox.write_string();
// more code below...
我的问题是关于控制台输出。我曾试图引入条件语句来启用 read 或 write 模式。以上代码用于写入到文件。下面有更多的代码行,用于读取来自文件,它们也可以正常工作。
我的挑战是,一旦我为上述代码引入条件语句......
printf("%s", "Enter 1 to WRITE DATA or 2 to READ DATA\n");
cin >> options;
if (options == 1)
{
fileIps Inptbox; // for entering new data
//... rest of code...
}
// more code below...
...控制台上的输出存在缺陷,因为显示第一个条目的提示但完全被跳过,迫使用户首先输入“官员的内部通信号码”。第三个提示运作良好。
进一步详细说明,当我使用cin
将值1分配给options
(即应用条件)时,控制台会立即打印...
Enter Officer's Title:
Enter Officer's Intercom Number:
...让我无法填写第一个条目(即' Title ')。
我为此努力并尝试了几件事来解决它。我使用fgets()
,甚至尝试使用gets()
。我重新访问了我的课程,但没有任何效果。我广泛阅读缓冲,研究本网站上的问题,查看cstdio
以及ios_base
及其衍生类的各种资源(这很好,因为我学到了很多其他东西)。但是,除非我从我的代码中删除了“if”语句,否则我尝试的其他任何工作都没有。
所以,我的问题是:“如何解释这种行为以及如何最好地实现我的代码以使我能够在读写模式之间切换?”
我正在使用 MS Visual Studio 2015 。
答案 0 :(得分:0)
使用格式化提取运算符'>>'有它的问题。在这种情况下,它会读取所有可以转换为整数的值。但是,您必须输入一个表示您已做好准备的信号。 >>运算符不处理该换行符。当下次读取输入时,它会看到先前给定的换行符。因此,“输入官员的标题”输入立即设置为换行并继续。尝试使用类似的东西:
with toupdate as (
select t.*, row_number() over (partition by team order by id) as seqnum
from test
)
update toupdate
set StartDate = DateAdd(SECOND, - ProjectedTime * 60, EndDate)
where seqnum > 1;
测试字符串或转换它。