Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何读取和处理格式化日期,如1998年11月1日,星期日(10000个输入)C++;_C++_Formatted Text - Fatal编程技术网

C++ 如何读取和处理格式化日期,如1998年11月1日,星期日(10000个输入)C++;

C++ 如何读取和处理格式化日期,如1998年11月1日,星期日(10000个输入)C++;,c++,formatted-text,C++,Formatted Text,我需要看一下工作日的日期。首先,我需要读取日期和工作日,然后计算总工作日,例如: 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

我需要看一下工作日的日期。首先,我需要读取日期和工作日,然后计算总工作日,例如:

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;
字符串行;
串日[7]={“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”};
ifstream-infle(“input.txt”);
流有效文件(“valid.txt”);
流无效文件(“invalid.txt”);
int-total=0;
国际日期[2],月[2],年[4];
int星期日=0,星期一=0,星期二=0,星期三=0,星期四=0,星期五=0,星期六=0;
字符符号='/';
字符symbol2=',';
while(getline(infle,line)){
总计=总计++;
}
有效文件符号>>月[2]>>符号>>年[4]>>符号2>>行;
如果(行比较(天[0])==0){
周日++;
}
否则如果(行比较(第[1]天))=0{
星期一++;
}
否则如果(行比较(第[2]天))=0{
星期二++;
}
否则如果(行比较(第[3]天))=0{
星期三++;
}
否则如果(行比较(第[4]天))=0{
星期四++;
}
否则如果(行比较(第[5]天))=0{
星期五++;
}
否则如果(行比较(第[6]天))=0{
周六++;
}
}

cout在第一次循环之后,您已经到达文件的末尾

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

//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()) {
例如:
infle>>day[2]
将只读取一个字符,而不是2个字符。另外,我猜你写的是
day
,而不是
date

一种可能的解决方案是使用infle.get(date,2)读取2个字节,或者读取行并复制子字符串

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

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. 
}
字符串行;
串日、月、年、工作日、空间;
字符分隔符='/';
ifstream-infle(“input.txt”);
while(getline(infle,line))
{
++总数;
}

cout第一个问题

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

string day[7] = ...
这将在以后影响你的健康(见第4页)

第二个问题

这些:

int date[2], month[2], year[4];
是数组。您不需要数组,只需要保存日期、月份和年份值的整数:

int date, month, year;
第三个问题

在这里:

第二个循环将永远不会执行,因为您将在第一个循环中到达文件的末尾

第四个问题

您在这里所做的一切:

infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
是尽可能错误和错误的:

  • 由于用于存储日整数的变量名为
    date
    ,因此实际上是在写入存储工作日名称的数组中的第三个位置。如果
    day
    是const(参见#1),您将得到一个编译器错误,并立即指出这个错误
  • 您在数组大小之外写入。例如,
    month
    具有大小
    2
    ,因此您无法写入索引
    2
    ,因为它只有索引
    0
    1
    。无论如何,您都不应该为此使用数组,请参见#2
  • 覆盖
    symbol
    symbol2
    ,而不是检查文件是否在预期位置包含它们
  • 将以空格开头,因为您只读取逗号,但文件由逗号和空格分隔
第五个问题

您的命名不符合约定:

int Sunday = 0, Monday = 0, Tuesday = 0, Wednesday = 0, Thursday = 0, Friday = 0, Saturday = 0;
虽然仍然是法定代码,但您应该坚持命名约定,变量名以小写开头。此外,您还应该认真考虑更好的变量名称。让他们说话,例如
工作日名
而不是

第六个问题


您没有调试代码,因此浪费了每个人的时间。调试代码,您将看到变量发生了什么。您将看到执行循环的频率以及循环内部发生的情况。然后,您可以找出代码出错的确切位置,甚至可能是原因。

寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现此问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请在代码上运行调试器,查看哪些地方没有达到预期效果。请阅读一行,然后在该行上使用字符串find/substr查找逗号,工作日在该行之后。将其转换为小写,并使用
std::map
在读取时计算出现次数和行数。不确定原因,当我使用infle时,调试过程一直在运行。seekg(0)
getline
不将char作为输入参数。请浏览getline文档。()
infile >> day[2] >> symbol >> month[2] >> symbol >> year[4] >> symbol2 >> line;
int Sunday = 0, Monday = 0, Tuesday = 0, Wednesday = 0, Thursday = 0, Friday = 0, Saturday = 0;