C++ 终止多行用户输入?

C++ 终止多行用户输入?,c++,user-input,vector,C++,User Input,Vector,最近的项目有点问题。这里的目标是能够输入几行文本,其中包含mm/dd/yyyy格式的日期,后跟空格,然后是事件描述。我已经实现了允许多行文本输入(我想),但现在我不确定如何停止它。有没有一种方法可以简单地假设在设定的时间之后,用户已经完成了输入?这个问题给我带来了很大的压力,因为他们从来没有真正讨论过如何使用最终用户输入,而只是如何完成多行。我们必须使用标准的用户输入,而不是文本文件,这样会更容易。下面的代码,如果我在其他地方犯了一个未被注意到的错误,请随时告诉我。我只需要能够让用户完成输入,这

最近的项目有点问题。这里的目标是能够输入几行文本,其中包含mm/dd/yyyy格式的日期,后跟空格,然后是事件描述。我已经实现了允许多行文本输入(我想),但现在我不确定如何停止它。有没有一种方法可以简单地假设在设定的时间之后,用户已经完成了输入?这个问题给我带来了很大的压力,因为他们从来没有真正讨论过如何使用最终用户输入,而只是如何完成多行。我们必须使用标准的用户输入,而不是文本文件,这样会更容易。下面的代码,如果我在其他地方犯了一个未被注意到的错误,请随时告诉我。我只需要能够让用户完成输入,这样程序就可以对事件[]重新排序并输出它们

日历.cpp

#include <string>
#include <sstream>
#include <iostream>
#include <vector>

using namespace std;
#include "event.h"


int main(){
 // Maximum number of input lines
 const int MAX = 100; 

 // Array of pointers to events 
 Event *events[MAX];

 // Number of currently used pointers in events
 int size = 0;
 int i = 0;

 // Vector containing each input line as a string
 vector<string> vec (100);
 char temps[100];
 while(i < MAX){
  cin.getline(temps, 100);
  vec[i] = temps; 
  i++;
 }


 for(int i = 0; i < vec.size(); i ++){
   int found = vec[i].find("/");
   int tmo = atoi(vec[i].substr(0, found).c_str());
   int sfound = vec[i].find("/", found + 1, 6);
   int tda = atoi(vec[i].substr(found + 1, sfound - (found + 1)).c_str());
   int tye = atoi(vec[i].substr(sfound + 1, 4).c_str());
   string tdes = vec[i].substr(sfound + 6, vec[i].length() - (sfound + 6));
   events[size] = new Event(tmo, tda, tye, tdes);
   size++;
 }

 return 0;
}
#include <iostream>
#include <string>

using namespace std;
#include "event.h"

Event::Event(int mo, int da, int ye, string des){
 month = mo;
 day = da;
 year = ye;
 desc = des;
}

Event::~Event(){

}

void Event::print(){
 cout << month << "/" << day << "/" << year << " " << desc << endl;
}
#包括
#包括
#包括
#包括
使用名称空间std;
#包括“event.h”
int main(){
//最大输入行数
常数int MAX=100;
//指向事件的指针数组
事件*事件[MAX];
//事件中当前使用的指针数
int size=0;
int i=0;
//以字符串形式包含每个输入行的向量
载体vec(100);
char-temps[100];
而(i
event.cpp

#include <string>
#include <sstream>
#include <iostream>
#include <vector>

using namespace std;
#include "event.h"


int main(){
 // Maximum number of input lines
 const int MAX = 100; 

 // Array of pointers to events 
 Event *events[MAX];

 // Number of currently used pointers in events
 int size = 0;
 int i = 0;

 // Vector containing each input line as a string
 vector<string> vec (100);
 char temps[100];
 while(i < MAX){
  cin.getline(temps, 100);
  vec[i] = temps; 
  i++;
 }


 for(int i = 0; i < vec.size(); i ++){
   int found = vec[i].find("/");
   int tmo = atoi(vec[i].substr(0, found).c_str());
   int sfound = vec[i].find("/", found + 1, 6);
   int tda = atoi(vec[i].substr(found + 1, sfound - (found + 1)).c_str());
   int tye = atoi(vec[i].substr(sfound + 1, 4).c_str());
   string tdes = vec[i].substr(sfound + 6, vec[i].length() - (sfound + 6));
   events[size] = new Event(tmo, tda, tye, tdes);
   size++;
 }

 return 0;
}
#include <iostream>
#include <string>

using namespace std;
#include "event.h"

Event::Event(int mo, int da, int ye, string des){
 month = mo;
 day = da;
 year = ye;
 desc = des;
}

Event::~Event(){

}

void Event::print(){
 cout << month << "/" << day << "/" << year << " " << desc << endl;
}
#包括
#包括
使用名称空间std;
#包括“event.h”
事件::事件(int-mo、int-da、int-ye、字符串des){
月=月;
日=da;
年=叶;
desc=des;
}
事件::~Event(){
}
void事件::print(){

cout通常,您需要用户键入可识别的内容来界定其输入。例如,在
邮件
中,通过一条空行将标题与正文区分开来。您可以考虑要求用户有两条空行,或一些文本字符串,如“END”或“”,或者您可以等到看到另一个隐式表示下一个事件开始的日期

如果你真的想超时…大多数操作系统都有一个
select()
函数,可以在stdin文件描述符上等待,如果一段时间内没有读取/异常事件发生,则超时。或者,你可以阻止读取并设置计时器(例如,Linux上的alarm(2)、setitimer()


(顺便说一下,学习如何为你的类编写流式运算符是值得的,但是这是一个足够大的主题,我不打算在这里深入研究。你也应该考虑使用PurthBook()来将输入行放进你的向量中,而不是用很多空字符串来创建它,并对它们吹毛求疵。那样,你就不用使用了。“100”和最大值,但在处理输入时可以简单地让事物“自然”增长。)

您应该给用户一个转义字符,以使循环退出


//you should probably prompt the user.
 //some testing may be in order to determine the end of line sequence
 //could be \r\n or \n depending on OS, iirc
 string escape("**\r\n");
 const char * escape_ptr = escape.c_str();
 cout << "Please enter ** on one line to quit." << endl;
 vector<string> vec (100);
 char temps[100];
 while(i < MAX){
  cin.getline(temps, 100);
  vec[i] = temps;

  if (strncmp(temps,escape_ptr,4) == 0) {
     break; //the escape sequence was typed.
  }

  i++;
 }

//您可能应该提示用户。
//可能需要进行一些测试,以确定线端序列
//可能是\r\n或\n,具体取决于操作系统,iirc
字符串转义(“**\r\n”);
const char*escape_ptr=escape.c_str();

cout实现这一点的一种方法是让用户按Ctrl-D表示文件结束。您必须检查循环中的文件结束

while ((i < MAX) && (!cin.eof()) {
  cin.getline(temps, 100);
  vec[i] = temps; 
  i++;
 }
while((i
这种方法还有一个额外的好处,即可以向程序显示文本文件,而不是用户输入,并且在到达文件末尾时也可以获得相同的结果

编辑:


Ctrl-Z是Windows计算机上的EOF按键。Ctrl-Z可能必须位于该操作系统上一行的开头(有关此主题的详细信息,请参阅的讨论)

这正是我要找的。非常感谢您的帮助,我将试一试!非常感谢您的建议。不幸的是,我无法使用指定的分隔符,因为这些程序是使用Linux“diff”命令和一组预格式化的测试文件(满是参数)测试的。选择()虽然函数听起来很有趣,但我会仔细阅读。