C++ getline()和ncurses输出不理想

C++ getline()和ncurses输出不理想,c++,getline,ncurses,C++,Getline,Ncurses,如果我有 #include <iostream> #include <ncursesw/curses.h> #include <fstream> #include <string> using namespace std; int main(){ initscr(); curs_set(0); int row, col; getmaxyx(stdscr, row, col); //forgot these or

如果我有

#include <iostream>
#include <ncursesw/curses.h>
#include <fstream>
#include <string>

using namespace std;

int main(){

    initscr();
    curs_set(0);
    int row, col;
    getmaxyx(stdscr, row, col); //forgot these originally

    string name, server, displayanswer;

        ifstream nameserverinput("nameserver.txt");

        if(!nameserverinput.is_open()){
            erase();
            string error = "nameserver.txt could not be found. Exiting...";
            mvprintw(row/2 - 1, (col-error.size())/2, error.c_str());
            refresh();
            sleep(5);
            return 0;
        }

        nameserverinput >> name >> server >> displayanswer;
        nameserverinput.close();

    erase();
    string error = (name + " (" + server + ") " + "is not in a game.");
    mvprintw(row/2 - 1, (col-error.size())/2, error.c_str());
    refresh();

}
如果我用getline(nameserverinput,name)替换nameserverinput>>name,如下所示:

那么我的输出是:

(NA) is not in a game.                   imaqtpie

由于某些原因,发送到“name”之后的所有内容都会发送到行的开头。我猜这可能是getline()在“name”的末尾推了一些东西,而ncurses mvprintw输出不太喜欢这些东西。除此之外,我无法想象问题会是什么,因为getline()的工作方式应该与>>操作符几乎相同。我尝试用getline()替换所有内容,但没有效果。我需要“名称”来包含空格的可能性,那么我的其他选择是什么?(在不使用ncurses的情况下尝试此操作,而使用cout示例中缺少一些内容(
initscr
从未调用)

但假设您只是在剪切/粘贴中忽略了这一点:
getline
将响应标准输出。一般来说,您不能混合使用stdio和ncurses调用(或任何curses实现),因为ncurses在写入屏幕之前会以其自己的方式进行缓冲,并且stdio不一定知道缓冲区

如果必须混合使用stdio和ncurses,则必须执行
fflush
,以确保在切换回ncurses之前完成编写(以及
在返回stdio之前刷新

使用建议的修订版(再加上确保程序正常退出),我在本例中看到了使用/不使用getline的相同行为:

#包括
#包括
#包括
#包括
使用名称空间std;
int
main()
{
initscr();
curs_集(0);
int row,col;
getmaxyx(stdscr,row,col);//最初忘记了这些
字符串名称、服务器、displayanswer、postgameanswer;
ifstream nameserverinput(“nameserver.txt”);
如果(!nameserverinput.is_open()){
擦除();
字符串错误=“找不到nameserver.txt。正在退出…”;
mvprintw(行/2-1,(列-error.size())/2,error.c_str());
刷新();
睡眠(5);
wgetch(stdscr);
endwin();
返回0;
}
#如果1
getline(名称服务器输入,名称);
名称服务器输入>>服务器>>显示应答>>游戏后应答;
#否则
名称服务器输入>>名称>>服务器>>显示应答;
#恩迪夫
nameserverinput.close();
擦除();
字符串错误=(name+“(“+server+”)“+”不在游戏中。”);
mvprintw(行/2-1,(列-error.size())/2,error.c_str());
刷新();
wgetch(stdscr);
endwin();

}
我猜这可能是getline()在“name”的末尾推了一个转义字符,比如\n-不,不是,读一些你不知道其行为的函数是一个好主意。谢谢你的回答。我在initscr()中编辑了它,以显示它最初的样子。我现在(在我自己的代码中)放置了initsrc()在nameserverinput.close()之后初始化,并将fflush(stdout)和fflush(stderr)(为安全起见)放在前面,但我仍然有一个问题(我还注释了cout的任何用法为安全起见),仅供参考,即“后期游戏”变量不应该出现在我的代码中,忘了取出它。复制刚刚发布的代码,我的输出肯定会根据是否使用getline()而改变。如果这有什么区别的话,我会在Linux(Raspberry Pi)上运行它。我不希望这有什么区别(我在Debian6上测试了当前和稳定的ncurses,以防万一,但没有匹配的配置)公平的说,你是否碰巧用FFLUP来工作?如果不是,我可能会尝试避免像你暗示的STDIO,只是在源代码中写名字/服务器/显示值。实际上,一旦我能够运行这个例子,我就看不到什么东西会出错——只输出输出。也许问题不是在NCURSE中,而是在C++运行时。(您使用的是哪个版本的g++?)
 getline(nameserverinput, name)
 nameserverinput >> server >> displayanswer;
(NA) is not in a game.                   imaqtpie