-2

我需要阅读带有工作日的日期。首先,我需要阅读日期和工作日,然后计算总工作日,例如:

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;
4

3 回答 3

2

Variables daymonth并且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)在此处获得。让我知道它是否有帮助。

于 2018-03-21T10:34:05.747 回答
0

在第一个循环之后,您已经到达文件末尾。

到达文件末尾后,您需要在开始第二个循环之前回到开头:

//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。我猜你写的是 today而不是 to date。一种可能的解决方案是使用 infile.get(date,2) 读取 2 个字节,或读取行并复制子字符串。

于 2018-03-21T09:26:12.050 回答
0

第一个问题

您对包含工作日名称的数组的声明不是 const:

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。
  • 您覆盖symboland symbol2,而不是检查文件是否在预期位置包含它们。
  • line将以空格开头,因为您只阅读逗号,但您的文件由逗号和空格分隔。

第五题

您的命名不遵循约定:

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

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

第六个问题

您没有调试代码,因此浪费了每个人的时间。调试你的代码,你会看到你的变量发生了什么。您将看到循环执行的频率以及内部发生的情况。然后你可以弄清楚你的代码到底哪里出错了,甚至可能是为什么。

于 2018-03-21T11:30:14.773 回答