如何读取和处理格式化日期,如 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 个字节,或读取行并复制子字符串。

变量 daymonthyear 而不是 具有以下代码行的预期值,因为索引意味着您正在写入这些数组中的特定字符位置:

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,因为它只有索引 01。你不应该为此使用数组,参见#2。
  • 您覆盖 symbolsymbol2,而不是检查文件是否在预期位置包含它们。
  • line 将以 space 开头,因为您只读逗号,但您的文件由逗号和 space.
  • 分隔

第五题

您的命名不符合约定:

int Sunday = 0, Monday = 0, Tuesday = 0, Wednesday = 0, Thursday = 0, Friday = 0, Saturday = 0;

虽然仍然是合法代码,但您应该遵守命名约定,变量名以小写开头。此外,您应该认真考虑为您的变量起更好的名称。让他们说话,例如weekDayNames 而不是 day.

第六题

你不是在调试你的代码,因此浪费了大家的时间。调试您的代码,您将看到 您的变量发生了什么。您将查看 循环的执行频率以及内部发生的情况。然后您可以弄清楚您的代码究竟在哪里出错,甚至可能是为什么。