Мне нужно прочитать дату с рабочим днем. Прежде всего, мне нужно прочитать дату и день недели, а затем рассчитать общий день недели, например:
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;
После 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 байтов или для чтения строки и копирования подстрок.
переменные 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)
доступен Вот.
Дайте мне знать, если это поможет.
Первая проблема
Ваше объявление массива, содержащего названия дней недели, не является постоянным:
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
,
Шестая проблема
Вы не отлаживаете свой код, тратя впустую время каждого. Отладьте свой код, и вы будете увидеть что происходит с вашими переменными. Ты сможешь увидеть как часто выполняются ваши циклы и что происходит внутри. Тогда вы можете выяснить, где именно Ваш код идет не так и, возможно, даже почему.