如果我有
#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有关。
答案 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();
}