我的程序当前正在做的是读取文本文件,然后在屏幕上显示内容。我想要它做什么,每次更改时读取文件,然后刷新屏幕并显示新的文件内容。我试图实现一个循环,但在尝试运行时遇到异常错误。这是我目前使用循环的设置:
void number(HWND hwnd){
HANDLE dwChangeHandles[2];
char path[250];
ExpandEnvironmentStrings("%AppData%\\\ECDisplay\\", path, 250);
char versionpath[250];
ExpandEnvironmentStrings("%AppData%\\\ECDisplay\\nursery.txt",
versionpath, 250);
std::ifstream file(versionpath);
std::string str;
while (std::getline(file, str)){
nurserynumber = str;
file.close();
}
dwChangeHandles[0] = FindFirstChangeNotification(
path, // directory to watch
FALSE, // do not watch subtree
FILE_NOTIFY_CHANGE_LAST_WRITE); // watch file name changes
if (dwChangeHandles[0] == INVALID_HANDLE_VALUE)
{
}
else{
number(hwnd);
}
}
修改 我最初收到的错误: EC Display.exe中0x7789EA0B(ntdll.dll)处于未处理的异常:0xC0000374:堆已损坏(参数:0x778D4270)。
编辑2 这是我目前的代码:
void number(HWND hwnd){
HANDLE dwChangeHandles[2];
char path[250];
ExpandEnvironmentStrings("%AppData%\\\ECDisplay\\", path, 250);
char versionpath[250];
ExpandEnvironmentStrings("%AppData%\\\ECDisplay\\nursery.txt",
versionpath, 250);
std::ifstream file(versionpath);
std::string str;
dwChangeHandles[0] = FindFirstChangeNotification(
path, // directory to watch
FALSE, // do not watch subtree
FILE_NOTIFY_CHANGE_LAST_WRITE); // watch file name changes
do{
while (std::getline(file, str)){
nurserynumber = str;
}
} while (dwChangeHandles[0] != INVALID_HANDLE_VALUE);
}
答案 0 :(得分:2)
至少有两件事可能会导致您的崩溃,但如果没有其他信息,我们只能猜测。
您在循环中关闭文件描述符:
while (std::getline(file, str)) {
...
file.close();
}
这在许多方面似乎都是错误的。
您似乎更有可能想要
if (!file.good()) {
// handle error
return;
}
if (!std::getline(file, str)) {
// didn't read anything, if we care:
return;
}
其次,您似乎正在使用递归。
在函数结束时,调用具有相同参数的函数而不仅仅是执行循环:
if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) {
}
else{
number(hwnd);
}
如果文件未打开,则执行一些错误处理,否则,再次调用该函数。每次调用都将使用额外的堆栈,最终你将耗尽堆栈并崩溃。
您应该重构代码以使用循环。例如,您可以将其设为
do {
// ...
} while (dwChangeHandles[0] != INVALID_HANDLE_VALUE);
循环整个函数内部。
您在函数中声明的所有变量都需要每次调用的堆栈空间,因此每次调用自身时它都会使用越来越多的堆栈。在其中一个调用返回并且堆栈展开之前,先前调用中的变量不会超出范围。
答案 1 :(得分:1)
阅读1行后关闭文件:
while (std::getline(file, str)){
nurserynumber = str;
file.close(); // ?????
}
因此,当您再次使用getline时,file不再是有效的文件流。
我想你想要file.close()
之外的while
,不是吗?