getline()和ncurses输出不理想

时间:2015-03-07 17:40:59

标签: 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 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();

}

我的输出完全没问题,一切都在中心位置很好。 nameserver.txt的示例如下:

imaqtpie
na
y

如果我替换nameserverinput&gt;&gt; getline(nameserverinput,name)的名称如下:

 getline(nameserverinput, name)
 nameserverinput >> server >> displayanswer;

然后我的输出是这样的:

(NA) is not in a game.                   imaqtpie

出于某种原因,通过“名称”发送的所有内容都会发送到该行的开头。我猜也许这是getline()在“name”的末尾推了一些东西,ncurses mvprintw输出并没有太多享受。除此之外,我无法想象问题是什么,因为getline()应该与&gt;&gt;几乎完全相同。运营商。我尝试用getline()替换所有内容无济于事。我需要“名字”来结合空间的可能性,那么我的另一个选择是什么? (在没有ncurses的情况下尝试这个,而是使用cout&lt;&lt; x&lt;&lt; endl理想地呈现一切,所以它必须与混合getline()和ncurses有关。

1 个答案:

答案 0 :(得分:0)

示例中缺少某些内容(永远不会调用initscr)。

但假设你在剪切/粘贴中简单地省略了它:getline将回显标准输出。一般来说,你不能混合stdio和ncurses调用(或任何 curses 实现),因为ncurses在写入屏幕之前以自己的方式缓冲事物,并且缓冲区不一定是stdio已知的。 / p>

如果你必须混合stdio和ncurses,你必须做fflush以确保你在切换回ncurses之前完成了写作(和refresh'在回到stdio之前。)

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

#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, postgameanswer;

    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);
        wgetch(stdscr);
        endwin();
        return 0;
    }

#if 1
    getline(nameserverinput, name);
    nameserverinput >> server >> displayanswer >> postgameanswer;
#else
    nameserverinput >> name >> server >> displayanswer;
#endif
    nameserverinput.close();

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