如何读取和处理格式化日期,如 01/11/1998、星期日(10000 个输入)C++
How to read and process the formatted date like 01/11/1998, Sunday(10000 inputs) C++
我需要阅读带有工作日的日期。首先,我需要读取日期和工作日,然后计算总工作日,例如:
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;
在第一个循环之后,您已到达文件末尾。
到达文件末尾后,您需要在开始第二个循环之前返回到开头:
//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()) {
此外:您在以下行中有错误:
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
例如:
infile >> day[2]
将只读取一个字符,而不是 2 个。我猜你写的是 day
而不是 date
。
一种可能的解决方案是使用 infile.get(date,2) 读取 2 个字节,或读取行并复制子字符串。
变量 day
、month
和 year
将 而不是 具有以下代码行的预期值,因为索引意味着您正在写入这些数组中的特定字符位置:
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.
}
std::getline (string)
的文档可用 here。
如果有帮助,请告诉我。
第一个问题
您对包含工作日名称的数组的声明不是常量:
string day[7] = ...
这会影响你以后的生活(见#4)。
第二题
这些:
int date[2], month[2], year[4];
是数组。您不需要数组,您只需要包含日、月和年值的整数:
int date, month, year;
第三题
此处:
while (getline(infile, line)) {
...
}
...
while (!infile.eof()) {
...
}
第二个循环将永远不会执行,因为您在第一个循环中到达文件末尾。
第四题
您在这里所做的一切:
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
是错误的和错误的:
- 由于用于存储日期整数的变量名为
date
,因此您实际上是在写入存储工作日名称的数组中的第三个位置。如果 day
是 const(见 #1),你会得到一个编译器错误,立即指出这个错误。
- 您写的超出了数组的大小。例如。
month
的大小为 2
,因此您不能写入索引 2
,因为它只有索引 0
和 1
。你不应该为此使用数组,参见#2。
- 您覆盖
symbol
和 symbol2
,而不是检查文件是否在预期位置包含它们。
line
将以 space 开头,因为您只读逗号,但您的文件由逗号和 space. 分隔
第五题
您的命名不符合约定:
int Sunday = 0, Monday = 0, Tuesday = 0, Wednesday = 0, Thursday = 0, Friday = 0, Saturday = 0;
虽然仍然是合法代码,但您应该遵守命名约定,变量名以小写开头。此外,您应该认真考虑为您的变量起更好的名称。让他们说话,例如weekDayNames
而不是 day
.
第六题
你不是在调试你的代码,因此浪费了大家的时间。调试您的代码,您将看到 您的变量发生了什么。您将查看 循环的执行频率以及内部发生的情况。然后您可以弄清楚您的代码究竟在哪里出错,甚至可能是为什么。
我需要阅读带有工作日的日期。首先,我需要读取日期和工作日,然后计算总工作日,例如:
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;
在第一个循环之后,您已到达文件末尾。
到达文件末尾后,您需要在开始第二个循环之前返回到开头:
//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()) {
此外:您在以下行中有错误:
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
例如:
infile >> day[2]
将只读取一个字符,而不是 2 个。我猜你写的是 day
而不是 date
。
一种可能的解决方案是使用 infile.get(date,2) 读取 2 个字节,或读取行并复制子字符串。
变量 day
、month
和 year
将 而不是 具有以下代码行的预期值,因为索引意味着您正在写入这些数组中的特定字符位置:
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.
}
std::getline (string)
的文档可用 here。
如果有帮助,请告诉我。
第一个问题
您对包含工作日名称的数组的声明不是常量:
string day[7] = ...
这会影响你以后的生活(见#4)。
第二题
这些:
int date[2], month[2], year[4];
是数组。您不需要数组,您只需要包含日、月和年值的整数:
int date, month, year;
第三题
此处:
while (getline(infile, line)) {
...
}
...
while (!infile.eof()) {
...
}
第二个循环将永远不会执行,因为您在第一个循环中到达文件末尾。
第四题
您在这里所做的一切:
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
是错误的和错误的:
- 由于用于存储日期整数的变量名为
date
,因此您实际上是在写入存储工作日名称的数组中的第三个位置。如果day
是 const(见 #1),你会得到一个编译器错误,立即指出这个错误。 - 您写的超出了数组的大小。例如。
month
的大小为2
,因此您不能写入索引2
,因为它只有索引0
和1
。你不应该为此使用数组,参见#2。 - 您覆盖
symbol
和symbol2
,而不是检查文件是否在预期位置包含它们。 line
将以 space 开头,因为您只读逗号,但您的文件由逗号和 space. 分隔
第五题
您的命名不符合约定:
int Sunday = 0, Monday = 0, Tuesday = 0, Wednesday = 0, Thursday = 0, Friday = 0, Saturday = 0;
虽然仍然是合法代码,但您应该遵守命名约定,变量名以小写开头。此外,您应该认真考虑为您的变量起更好的名称。让他们说话,例如weekDayNames
而不是 day
.
第六题
你不是在调试你的代码,因此浪费了大家的时间。调试您的代码,您将看到 您的变量发生了什么。您将查看 循环的执行频率以及内部发生的情况。然后您可以弄清楚您的代码究竟在哪里出错,甚至可能是为什么。