为什么没有写入我的文件?

时间:2015-03-17 09:32:59

标签: c++ file-io

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

2 个答案:

答案 0 :(得分:1)

在C和C ++中,在堆栈中创建的变量(也就是非指针变量)仅限于它们的范围。 我想你的函数将在外部循环中调用。 循环不会看到计数器。同样的开始。

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

  1. start-time(0)== 60只会测试一次。时间(0)总是大于开始。
  2. 计数器只会递增到1(并且自启动时间(0)<0)起不会,因为它不在循环内,而只在if子句中。
  3. 我可以根据您在那里发布的代码中的意图建议一个伪代码:

    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

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

答案 1 :(得分: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) 

最后没有效果。