每次修改文件时运行getline

时间:2015-06-09 01:24:37

标签: c++

我的程序当前正在做的是读取文本文件,然后在屏幕上显示内容。我想要它做什么,每次更改时读取文件,然后刷新屏幕并显示新的文件内容。我试图实现一个循环,但在尝试运行时遇到异常错误。这是我目前使用循环的设置:

    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);
}

2 个答案:

答案 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,不是吗?