7

我正在尝试使用 Eclipse 调试我用 C++ 编写的程序。该程序包括从用户那里获取输入,但是当我将输入输入到控制台时,它永远不会继续运行代码(它会一直要求输入)。如果不修复此问题,我将无法调试,希望能得到一些帮助。谢谢你。

代码卡在 while 循环 fgets 上:

int main(int argc, const char**argv) {
    FILE* inputFile = NULL;

    setlocale(LC_ALL, "");
    if(argc == 2){
        inputFile = fopen(argv[1], "r");
        if (inputFile == NULL){
            printf("Problem opening file %s, make sure correct path name is given.\n", argv[1]);
            return 0;
        }
    }
    else {
        inputFile = stdin;
    }

    char buffer[MAX_STRING_INPUT_SIZE];
    // Reading commands
    while ( fgets(buffer, MAX_STRING_INPUT_SIZE, inputFile) != NULL ) {
        fflush(stdout);
        if ( parser(buffer) == error ){
            printf("ERROR\n");
            break;
        }
    };
    fclose(inputFile);
    return 0;
}
4

2 回答 2

13

问题来自 Eclipse 缓冲控制台输入。修复它的一种方法是强制 Eclipse 使用 Windows/DOS 本机控制台进行调试。

该过程在此处进行了详细描述,但很简短:

  1. 从 Eclipse 菜单 File > New > C++ Project 创建您的 Hello World C++ 命令行项目
  2. 在您的项目文件夹中,创建一个“.gdbinit”文本文件。它将包含您的 gdb 调试器配置
  3. 编辑“.gdbinit”,并添加以下行(不带引号):“set new-console on”
  4. 在 Eclipse 中,转到菜单 Run > “Debug Configurations”,然后在左侧窗格中选择您的应用程序名称
  5. 在“调试器”选项卡中,确保“GDB 命令文件”现在指向您的 « .gdbinit » 文件。否则,输入“.gdbinit”配置文件的路径
  6. 单击“应用”和“调试”。你完成了 !应启动本机 DOS 命令行。
于 2013-11-06T23:09:40.810 回答
0

好吧,我知道 Eclipse 控制台缓冲区并不总是按应有的方式工作 - 根据我的经验,使用 C 或 C++ 时它是最糟糕的。

如果您想在 Eclipse 中运行编译后的代码,这将极大地帮助不会消除您在 Eclipse 中可能遇到的显示问题:

setvbuf(stdout, NULL, 0, _IONBF);

但是,我不知道这会如何影响在 Eclipse 中使用stdin. 您最好的选择是使用Nicolas 的答案通过 DOS 控制台运行。多做一点工作,但我相信就足够了。

请注意,上面的行应在通过 Eclipse 运行代码时使用,以便获得某种健全的输出缓冲区,而不会出现一些混乱的代码内解决方法。编译实际使用时需要注释掉这一行。

于 2013-11-06T23:21:32.483 回答