为什么没有任何内容写入我的文件?
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++ 中,在堆栈中创建的变量(也称为非指针变量)被限制在它们的范围内。
我想您的函数将在外部循环内调用。
计数器不会被循环看到。开始时相同。
此外,您的代码中存在一些逻辑问题:
- start-time(0)==60 只会测试一次。 time(0) 总是大于 start.
- 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
}
玩得开心
女朋友
编辑:
如果你从外部无限循环调用这个函数,你必须通过引用传递计数器(这样函数内部的增量将从外部看到)并作为参数开始。
我正在用 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++ 中,在堆栈中创建的变量(也称为非指针变量)被限制在它们的范围内。 我想您的函数将在外部循环内调用。 计数器不会被循环看到。开始时相同。
此外,您的代码中存在一些逻辑问题:
- start-time(0)==60 只会测试一次。 time(0) 总是大于 start.
- 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
}
玩得开心
女朋友
编辑: 如果你从外部无限循环调用这个函数,你必须通过引用传递计数器(这样函数内部的增量将从外部看到)并作为参数开始。