Как читать и обрабатывать форматированную дату, например, 01.11.1998, воскресенье (10000 входов) Переполнение стека

Мне нужно прочитать дату с рабочим днем. Прежде всего, мне нужно прочитать дату и день недели, а затем рассчитать общий день недели, например:

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;

-2

Решение

После 1-го цикла вы дойдете до конца файла.

После того, как вы дойдете до конца файла, вам нужно вернуться к началу, прежде чем начинать второй цикл:

//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 байтов или для чтения строки и копирования подстрок.

0

Другие решения

переменные 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) доступен Вот.
Дайте мне знать, если это поможет.

2

Первая проблема

Ваше объявление массива, содержащего названия дней недели, не является постоянным:

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 был констант (см. # 1), вы получите ошибку компилятора, сразу же указав вам на эту ошибку.
  • Вы пишете вне размера массивов. Например. month имеет размер 2, так что вы не можете писать в индекс 2так как имеет только индексы 0 а также 1, Вы не должны использовать массивы в любом случае для этого, см. # 2.
  • Вы перезаписали symbol а также symbol2вместо проверки, содержит ли файл их в ожидаемой позиции.
  • line начнется с пробела, так как вы читаете только запятую, но ваш файл разделяется запятой и пробелом.

Пятая проблема

Ваше наименование не соответствует соглашениям:

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

Несмотря на то, что код по-прежнему допустим, вы должны придерживаться соглашений об именах, имена переменных начинаются с нижнего регистра. Также вы должны серьезно подумать о лучших именах для ваших переменных. Сделать их говорить, например weekDayNames вместо day,

Шестая проблема

Вы не отлаживаете свой код, тратя впустую время каждого. Отладьте свой код, и вы будете увидеть что происходит с вашими переменными. Ты сможешь увидеть как часто выполняются ваши циклы и что происходит внутри. Тогда вы можете выяснить, где именно Ваш код идет не так и, возможно, даже почему.

0
По вопросам рекламы [email protected]