C++ 如何读取和处理格式化日期,如1998年11月1日,星期日(10000个输入)C++;
我需要看一下工作日的日期。首先,我需要读取日期和工作日,然后计算总工作日,例如:C++ 如何读取和处理格式化日期,如1998年11月1日,星期日(10000个输入)C++;,c++,formatted-text,C++,Formatted Text,我需要看一下工作日的日期。首先,我需要读取日期和工作日,然后计算总工作日,例如: total Sunday :1000 total Monday :1000 ...... 我总是得到的值是0。 输入文件如下所示: 23/10/2005, Sunday 26/07/2016, Tuesday 10/01/1995, Tuesday 14/10/2015, Wednesday 30/09/1982, Thursday 22/09/1993, Wednesday 21/05/1972, Sunday
total Sunday :1000
total Monday :1000
......
我总是得到的值是0。
输入文件如下所示:
23/10/2005, Sunday
26/07/2016, Tuesday
10/01/1995, Tuesday
14/10/2015, Wednesday
30/09/1982, Thursday
22/09/1993, Wednesday
21/05/1972, Sunday
23/01/2017, Monday
20/05/1974, Monday
27/11/1985, Wednesday
11/07/2005, Monday
06/09/2014, Saturday
16/03/1991, Saturday
09/03/1970, Monday
17/08/2015, Monday
04/05/2010, Tuesday
14/11/2013, Thursday
13/11/2015, Friday
08/10/1995, Sunday
07/09/1986, Sunday
.....
其中有10000个
string line;
string day[7] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
ifstream infile("input.txt");
ofstream validfile("valid.txt");
ofstream invalidfile("invalid.txt");
int total = 0;
int date[2], month[2], year[4];
int Sunday = 0, Monday = 0, Tuesday = 0, Wednesday = 0, Thursday = 0, Friday = 0, Saturday = 0;
char symbol = '/';
char symbol2 = ',';
while (getline(infile, line)) {
total = total++;
}
validfile << "Valid file\n" << "The total record :" << total << endl;
while (!infile.eof()) {
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
if (line.compare(day[0]) == 0) {
Sunday++;
}
else if (line.compare(day[1]) == 0) {
Monday++;
}
else if (line.compare(day[2]) == 0) {
Tuesday++;
}
else if (line.compare(day[3]) == 0) {
Wednesday++;
}
else if (line.compare(day[4]) == 0) {
Thursday++;
}
else if (line.compare(day[5]) == 0) {
Friday++;
}
else if (line.compare(day[6]) == 0) {
Saturday++;
}
}
cout << "Total Sunday :" << Sunday << endl;
cout << "Total Monday :" << Monday << endl;
cout << "Total Tuesday :" << Tuesday << endl;
cout << "Total Wednesday :" << Wednesday << endl;
cout << "Total Thursday :" << Thursday << endl;
cout << "Total Friday :" << Friday << endl;
cout << "Total Saturday :" << Saturday << endl;
字符串行;
串日[7]={“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”};
ifstream-infle(“input.txt”);
流有效文件(“valid.txt”);
流无效文件(“invalid.txt”);
int-total=0;
国际日期[2],月[2],年[4];
int星期日=0,星期一=0,星期二=0,星期三=0,星期四=0,星期五=0,星期六=0;
字符符号='/';
字符symbol2=',';
while(getline(infle,line)){
总计=总计++;
}
有效文件符号>>月[2]>>符号>>年[4]>>符号2>>行;
如果(行比较(天[0])==0){
周日++;
}
否则如果(行比较(第[1]天))=0{
星期一++;
}
否则如果(行比较(第[2]天))=0{
星期二++;
}
否则如果(行比较(第[3]天))=0{
星期三++;
}
否则如果(行比较(第[4]天))=0{
星期四++;
}
否则如果(行比较(第[5]天))=0{
星期五++;
}
否则如果(行比较(第[6]天))=0{
周六++;
}
}
cout在第一次循环之后,您已经到达文件的末尾
到达文件末尾后,在开始第二个循环之前,需要返回到开头:
//this is the 1st loop in your code:
while (getline(infile, line)) {
total = total++;
}
validfile << "Valid file\n" << "The total record :" << total << endl;
//now you need to rewind:
infile.clear(); //clear EOF state
infile.seekg(0); //back to beginning
//then continue the 2nd loop
while (!infile.eof()) {
例如:
infle>>day[2]
将只读取一个字符,而不是2个字符。另外,我猜你写的是day
,而不是date
。
一种可能的解决方案是使用infle.get(date,2)读取2个字节,或者读取行并复制子字符串 变量日
、月
和年
将不具有以下代码行中的预期值,因为索引意味着您正在写入这些数组中的特定字符位置:
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
这里有一种替代方法,使用带有预期分隔符的getline()
:
string line;
string day, month, year, weekday, space;
char separator = '/';
ifstream infile("input.txt");
while (getline(infile, line))
{
++total;
}
cout << "total" << total << endl;
//do your stuff.
infile.clear();
infile.seekg(0);
total=0; // just reinitialising to check, you can ignore.
while (getline(infile, day, separator) &&
getline(infile, month, separator) &&
getline(infile, year, ',') &&
getline(infile, space, ' ') &&
getline(infile, weekday))
{
++total;
cout << day << "-" << month<< "-" << year << "-" << weekday<< endl;
//Do your stuff.
}
字符串行;
串日、月、年、工作日、空间;
字符分隔符='/';
ifstream-infle(“input.txt”);
while(getline(infle,line))
{
++总数;
}
cout第一个问题
您对包含工作日名称的数组的声明不是常量:
string day[7] = ...
这将在以后影响你的健康(见第4页)
第二个问题
这些:
int date[2], month[2], year[4];
是数组。您不需要数组,只需要保存日期、月份和年份值的整数:
int date, month, year;
第三个问题
在这里:
第二个循环将永远不会执行,因为您将在第一个循环中到达文件的末尾
第四个问题
您在这里所做的一切:
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
是尽可能错误和错误的:
- 由于用于存储日整数的变量名为
date
,因此实际上是在写入存储工作日名称的数组中的第三个位置。如果day
是const(参见#1),您将得到一个编译器错误,并立即指出这个错误
- 您在数组大小之外写入。例如,
month
具有大小2
,因此您无法写入索引2
,因为它只有索引0
和1
。无论如何,您都不应该为此使用数组,请参见#2
- 覆盖
symbol
和symbol2
,而不是检查文件是否在预期位置包含它们
行
将以空格开头,因为您只读取逗号,但文件由逗号和空格分隔
第五个问题
您的命名不符合约定:
int Sunday = 0, Monday = 0, Tuesday = 0, Wednesday = 0, Thursday = 0, Friday = 0, Saturday = 0;
虽然仍然是法定代码,但您应该坚持命名约定,变量名以小写开头。此外,您还应该认真考虑更好的变量名称。让他们说话,例如工作日名
而不是日
第六个问题
您没有调试代码,因此浪费了每个人的时间。调试代码,您将看到变量发生了什么。您将看到执行循环的频率以及循环内部发生的情况。然后,您可以找出代码出错的确切位置,甚至可能是原因。寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现此问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请在代码上运行调试器,查看哪些地方没有达到预期效果。请阅读一行,然后在该行上使用字符串find/substr查找逗号,工作日在该行之后。将其转换为小写,并使用std::map
在读取时计算出现次数和行数。不确定原因,当我使用infle时,调试过程一直在运行。seekg(0)getline
不将char作为输入参数。请浏览getline文档。()
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
int Sunday = 0, Monday = 0, Tuesday = 0, Wednesday = 0, Thursday = 0, Friday = 0, Saturday = 0;