为什么我的变量从1变为2然后又变回1?

时间:2012-07-30 18:08:24

标签: c++ ifstream ofstream gettickcount

我一直在创建一个空闲程序,以便在鼠标和键盘处于非活动状态时在几分钟内计算。这就是我到目前为止所做的:

using namespace std;

while(true)
{
    GetLastInputInfo(&last_info);
    tickCount = GetTickCount();
    int minutes = (tickCount - last_info.dwTime) / 60000;
    count++;

    if((minutes >= 1) && (count%3000==0))
    {
        ifstream in("in.txt");
        ofstream out("out.txt");
        float sum;
        in >> sum;
        sum = sum++;
        out << sum;
        out << in.rdbuf();
        out.close();
        in.close();
    }
    std::cout << "Idle Time: " << minutes << " minutes." << std::endl;
}
}

当我将它闲置一分钟时,“总和”表示它是1,然后我关闭程序并再次打开它一分钟,“总和”表示它是2.我关闭程序并打开它更多的时间,然后又回到1.为什么会发生这种情况?

2 个答案:

答案 0 :(得分:5)

这一行是未定义的行为:

sum = sum++;

您不能在序列点之间多次修改变量。你应该写这个来增加sum变量:

sum++;

答案 1 :(得分:2)

这就是我的想法。

in.txt的内容      1

out.txt的内容      2      1      2      1

当你从in中读取你的值时,sum = 1; sum ++发生,sum变为2。

2进入out.txt;然后1进入out.txt。然后你打印“空闲时间”。因为总和初始化为1,所以它会四舍五入。

尝试评论此行

 out << in.rdbuf();

或声明具有更大范围的和(在文件读取循环之外)

你也似乎永远不会给它增加分钟......

编辑: 试试吧......

if((minutes >= 1) && (count%3000==0))
{
    time_t date = time(NULL); //store the time in our date
tm* timePtr = localtime(&t); //now we can extact dates out of it

    int day = timePtr->tm_mday;
    int month = timePtr->tm_mon;
    int year = 1900 + timePtr->tm_year; //trust me, you gotta 1900 to it.
    char* filename;
    sprintf(filename, "log-%d-%d-%d.txt", day, month, year);
    ifstream in(filename);
 //   float sum; why is this float when we do sum++ below?
    int sum;
    in >> sum;
    sum++;
    in.close();
    ofstream out(filename);
    out << sum;
    out.flush();
    out.close();
}