【问题标题】:using ncurses to print ascii art from file acts strangely使用 ncurses 从文件中打印 ascii 艺术行为奇怪
【发布时间】:2019-04-01 10:52:16
【问题描述】:

我正在尝试使用 ncurses 将存储在单独文件中的 ascii 艺术打印到终端。

这是我的 C 代码:

#include <ncurses.h>
#include <string.h>

int main() {
  initscr();
  raw();

  WINDOW * startScreen = newwin(20, 70, 0, 0);
  curs_set(FALSE);
  start_color();
  init_pair(1, COLOR_WHITE, COLOR_BLACK);
  attron(COLOR_PAIR(1));
  /** (READS AND PRINTS THE FILE HERE, DESCRIPTION BELOW) **/
  wrefresh(startScreen);
  attroff(COLOR_PAIR(1));
  wgetch(startScreen);
  endwin();
}

上面的代码读取文件的内容,如果文件中的字符是#,则打印一个块字符。 (按字符打印文件)所有内容都打印在startScreen,一个独立的窗口中。

这是文件的内容:

##     ##  ######   ######   ######  ######  ##        ########
###   ###    ##    ##    ## ##    ##   ##    ##        ##
#########    ##    ##       ##         ##    ##        ##
## ### ##    ##     ######   ######    ##    ##        ######
##  #  ##    ##          ##       ##   ##    ##        ##
##     ##    ##    ##    ## ##    ##   ##    ##        ##
##     ##  ######   ######   ######  ######  ########  ########


  #####   ######  ##     ## ##     ##   ###    ##   ## ######
 ##   ## ##    ## ###   ### ###   ###  ## ##   ###  ## ##   ##
##       ##    ## #### #### #### #### ##   ##  #### ## ##    ##
##       ##    ## ## ### ## ## ### ## ##    ## ####### ##    ##
##       ##    ## ##  #  ## ##  #  ## ######## ## #### ##    ##
 ##   ## ##    ## ##     ## ##     ## ##    ## ##  ### ##   ##
  #####   ######  ##     ## ##     ## ##    ## ##   ## ######

但是,当我运行 C 代码时,它会给出:

▒▒     ▒▒  ▒▒▒▒▒▒   ▒▒▒▒▒▒   ▒▒▒▒▒▒  ▒▒▒▒▒▒  ▒▒        ▒
▒▒▒   ▒▒▒    ▒▒    ▒▒    ▒▒ ▒▒    ▒▒   ▒▒    ▒▒        ▒▒
▒    ▒▒    ▒▒               ▒▒         ▒▒    ▒▒        ▒▒
▒▒ ▒▒▒ ▒▒    ▒▒     ▒▒▒▒▒▒   ▒▒▒▒▒▒    ▒▒    ▒▒        ▒▒▒▒▒▒
▒▒  ▒  ▒▒    ▒▒          ▒▒       ▒▒   ▒▒    ▒▒        ▒▒
▒▒     ▒▒    ▒▒    ▒▒    ▒▒ ▒▒    ▒▒   ▒▒    ▒▒        ▒▒
▒▒     ▒▒  ▒▒▒▒▒▒   ▒▒▒▒▒▒   ▒▒▒▒▒▒  ▒▒▒▒▒▒  ▒  ▒


  ▒▒▒▒▒   ▒▒▒▒▒▒  ▒▒     ▒▒ ▒▒     ▒▒   ▒▒▒    ▒▒   ▒▒ ▒▒▒▒▒▒
 ▒▒   ▒▒ ▒▒    ▒▒ ▒▒▒   ▒▒▒ ▒▒▒   ▒▒▒  ▒▒ ▒▒   ▒▒▒  ▒▒ ▒▒   ▒▒
▒▒       ▒▒    ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒   ▒▒  ▒▒▒▒ ▒▒ ▒▒    ▒▒
▒▒       ▒▒    ▒▒ ▒▒ ▒▒▒ ▒▒ ▒▒ ▒▒▒ ▒▒ ▒▒    ▒▒ ▒ ▒▒    ▒▒
▒▒       ▒▒    ▒▒ ▒▒  ▒  ▒▒ ▒▒  ▒  ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒    ▒▒
 ▒▒   ▒▒ ▒▒    ▒▒ ▒▒     ▒▒ ▒▒     ▒▒ ▒▒    ▒▒ ▒▒  ▒▒▒ ▒▒   ▒▒
  ▒▒▒▒▒   ▒▒▒▒▒▒  ▒▒     ▒▒ ▒▒     ▒▒ ▒▒    ▒▒ ▒▒   ▒▒ ▒▒▒▒▒▒

我完全不知道为什么缺少块。为什么会这样?

还有另一个 question 有类似的原因。但是,问题的特点不同,因此是一个单独的问题。

【问题讨论】:

  • @GabrielLee 也许你的图形文件被巧妙地弄乱了;也许尝试将上面的内容复制/粘贴到一个新的文本文件中。
  • 请注意getc(以及fgetc)返回一个int。这对于与EOF 的比较实际上非常重要。
  • 不过,我建议在空格字符的代码中添加另一个else if,然后else 以捕获任何其他字符。
  • @GabrielLee 出于好奇,我复制/编译了您的代码以及 ascii 艺术,它在这里没有问题。一定和你的环境有关。您是否偶然通过串行或其他不安全的通道传输数据?
  • @GabrielLee 好的,很好。但我担心,如果不对此进行调查,请在此处找出并告诉我们,没有人会这样做;)这可能是时间问题,您可以从在打印字符之间添加一点延迟开始

标签: c ncurses


【解决方案1】:

似乎这个问题在我第一次遇到这个问题的 Windows Subsystem for Linux 中是独一无二的。

相同的脚本在 Linux 中可以 100% 正常运行,但在适用于 Linux 的 Windows 子系统中却不行。

使其在 WSL 中工作的解决方法是在打印每个字符 wrefresh(startScreen) 后刷新窗口。但是,根本原因仍然未知。

【讨论】:

  • 根本原因是微软的 EEE 以及普遍无法遵循实际标准和有用的行为。
  • 在 W10 版本 1803 上使用 WSL,我构建并运行了您的程序,没有进行任何修改。它似乎没有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多