0

我一直在创建一个空闲程序,以在鼠标和键盘处于非活动状态时以分钟为单位进行计数。这是我到目前为止所拥有的:

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

当我让它空闲一分钟时,“sum”说它是 1,然后我关闭程序并再次打开它一分钟,“sum”说它是 2。我关闭程序并再打开一分钟,然后它恢复到 1。为什么会这样?

4

2 回答 2

5

此行是未定义的行为:

sum = sum++;

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

sum++;
于 2012-07-30T19:09:19.533 回答
2

这就是我认为会发生的事情。

in.txt 的内容 1

out.txt 的内容 2 1 2 1

当您将值从 in 读入 sum 时,sum = 1; sum++ 发生,sum 变为 2。

2进入out.txt;然后 1 进入 out.txt。然后你打印“空闲时间”。由于 sum 始终初始化为 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();
}
于 2012-07-30T18:47:30.957 回答