为什么没有任何内容写入我的文件?

Why isn't anything being written to my file?

我正在用 OpenCV 编写一个程序,我想记录我正在跟踪的两个对象的 X、Y 坐标。我已经很好地检索到数据并使用它在屏幕上显示坐标,但是我一直在努力将其写入日志文件。

我有一个函数,我将所有相关数据传递给它,我确信我的程序正在访问该函数,因为正在创建文件。

有人可以告诉我为什么 "test.txt" 是空的吗?提前谢谢你。

这是我的代码:

void saveData(int leftX, int leftY, int rightX, int rightY, int distance){
    logfile.open("test.txt");

    //Timer
    time_t start = time(0); //Set initial time point

    //Counter
    int counter = 0;

    //String for coordinates
    //String for coordinates
string coords = "Left X: " + intToString(leftX) + "  LeftY: " + intToString(leftY) +
    "  Right X: " + intToString(rightX) + "  Right Y: " + intToString(rightY) + "  Distance between: " + intToString(distance) + "\n";

    //If 1 minute has passed
    if (start - time(0) == 60){

        //Write coordinates to log file
        logfile << coords;

        //Increment counter
        counter++;

        //After 30 mins of recording exit program
        if (counter == 30){
            //Close the log file
            logfile.close();

            //Exit with no errors
            exit(0);
        }

        //Reset time to 0
        start = time(0);
    }
}

首先,如果你在无限循环中调用这个函数(正如你在评论中所说),也许你应该考虑不要在每次调用时打开文件。

其次,检查恰好 1 分钟是否通过可能会失败,因为两次检查之间的时间可能超过一秒。在这种情况下,您永远不会写入文件。最好检查是否超过一分钟。

最后,您的实际问题(如 samgak 所述)是

start - time(0)

将是负面的,而你应该这样做

if (time(0) - start > 60)

编辑:我刚刚意识到您的代码存在另一个问题:

//Timer
time_t start = time(0); //Set initial time point
// ...
//If 1 minute has passed
if (start - time(0) == 60){

你实际上是在检查这两行之间是否已经过了 1 分钟。如果这两行之间几乎没有发生任何事情,您就不太可能写入文件。

还有

start = time(0) 

最后没有效果。

在 C 和 C++ 中,在堆栈中创建的变量(也称为非指针变量)被限制在它们的范围内。 我想您的函数将在外部循环内调用。 计数器不会被循环看到。开始时相同。

此外,您的代码中存在一些逻辑问题:

  1. start-time(0)==60 只会测试一次。 time(0) 总是大于 start.
  2. counter 只会增加到 1(并且不会因为 start-time(0)<0)因为它不在循环内,而只在 if 子句中。

我可以根据你在上面发布的代码中你想做的事情来建议一个伪代码:

void saveData(data){
    open file

    setup start=time(0) and counter=0

    format the output string

    while(counter<=30){
        if((int)(time(0)-start)%60==0){ //seconds_passed=60*N, N integer
            write data
            counter++
        }    
    }

    close the file
}

玩得开心

女朋友

编辑: 如果你从外部无限循环调用这个函数,你必须通过引用传递计数器(这样函数内部的增量将从外部看到)并作为参数开始。