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

Why isn't anything being written to my file?

本文关键字:任何内 文件 我的 为什么      更新时间:2023-10-16

我正在用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);
    }
}

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

此外,您的代码中还有一些逻辑问题:

  1. 开始时间(0)==60将只测试一次。时间(0)将始终大于开始时间
  2. 计数器将仅递增到1(并且自开始时间(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
}

玩得开心

gf

编辑:如果您从外部无限循环调用此函数,则必须通过引用传递counter(因此从外部可以看到函数内部的增量)并作为参数开始。

首先,如果您在无限循环中调用此函数(正如您在注释中所说),也许您应该考虑不在每次调用时打开该文件。

其次,检查正好1分钟通过可能会失败,因为两次检查之间可能有超过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) 

最后没有效果。