从 c 文件中读取并打印特殊的 ascii 字符

Read and print special ascii characters from file in c

我想知道如何从 txt 文件中读取特殊的 ascii 字符。

我有这个文本文件,我想打印:

▄ ▀█   █     █   █▄    █▀
████  █   █  ███    █   ▄███▄ ██▄▄▄ ████▄

如何打印?当去打印它时我得到错误。怎么修?

我想为游戏制作主菜单。为了灵活起见,我不想直接打印,而是想输入文本文件。它应该打印出第 219 个字符的“ASCII BASTILLE DAY”,但它太乱了。我也尝试使用批处理文件,但它也不起作用。

代码如下:

void mainmenu()
{
    while (1) {
        if (mmplso <= 0) { PlaySound(TEXT("SFX\VLVce.wav"), NULL, SND_ASYNC); mmplso = 50800; }
        cls();
        hidcur();


        /*
        printf("\n              Made by Mauser\n\n%d\n\n                VER(1.0A)\n\n", mmplso);
        //
        //
        // 
        //
        printf("\n       %c%c%c    %c%c%c  %c%c%c  %c%c%c%c%c %c%c%c%c%c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("      %c   %c  %c    %c   %c   %c     %c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("      %c%c%c%c%c   %c%c  %c       %c     %c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("      %c   %c %c   %c %c   %c   %c     %c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("      %c   %c  %c%c%c   %c%c%c  %c%c%c%c%c %c%c%c%c%c\n\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        //
        printf("%c%c%c%c   %c%c%c    %c%c%c %c%c%c%c%c %c%c%c%c%c %c     %c     %c%c%c%c%c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219,
            (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("%c   %c %c   %c  %c      %c     %c   %c     %c     %c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("%c%c%c%c  %c%c%c%c%c   %c%c    %c     %c   %c     %c     %c%c%c%c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("%c   %c %c   %c %c   %c   %c     %c   %c     %c     %c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("%c%c%c%c  %c   %c  %c%c%c    %c   %c%c%c%c%c %c%c%c%c%c %c%c%c%c%c %c%c%c%c%c\n\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219), (char)219, (char)219, (char)219, (char)219, (char)219;
        //
        printf("            %c%c%c%c   %c%c%c  %c   %c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("            %c   %c %c   %c %c   %c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("            %c   %c %c%c%c%c%c  %c %c\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("            %c   %c %c   %c   %c\n", (char)219, (char)219, (char)219, (char)219, (char)219);
        printf("            %c%c%c%c  %c   %c   %c\n\n\n", (char)219, (char)219, (char)219, (char)219, (char)219, (char)219, (char)219);
        //
        */


        printf("PRESS ANY KEY...");
        if (_kbhit()) { PlaySound(TEXT("SFX\close.wav"), NULL, SND_ASYNC); break; }

        mmplso--;
    }
    system("cls");
}

void mainLoop()
{
    mmplso = 0;
    mainmenu();
    while (1)
    {
        Setup();
        mainGame();
    }
}

int main()
{
    SetConsoleCP(437);
    SetConsoleOutputCP(437);
    mainLoop();
    return 0;
}

```


问题很可能不在代码中,而在您创建文本文件的方式中。当您从网络上复制正在使用的章程(例如▀█▄)并将其粘贴到默认的Windows 记事本中时,它使用的是UTF-8 编码,即UNICODE,而您需要的是扩展ASCII。因此,首先我建议您使用 notepad++ 并手动将新文本文件的代码页设置为 OEM 852 之类的内容。在记事本 ++ 中,您可以这样做:

Encoding > Character Set > Central European > OEM 852

之后,当您将特殊字符粘贴到记事本++时,文本文件将保存为 ASCII 而不是 UNICODE。

正确创建文本文件后,您可以通过调用如下所示的函数将其打印到控制台:

void printMyFile(const char *fileName) {
    FILE *file = fopen(fileName, "r");
    fseek(file, 0L, SEEK_END);
    long size = ftell(file);
    fseek(file, 0L, SEEK_SET);
    char *buffer = (char *)calloc(size, sizeof(char));
    fread(buffer, sizeof(char), size, file);
    fclose(file);
    printf(buffer);
    free(buffer);
}

此外,如果您的控制台仍然错误地显示您的角色,您应该包括 Windows.h

#include <Windows.h>

并调用函数

SetConsoleOutputCP(852);

在向控制台打印任何内容之前执行一次。
祝你好运!

编辑 1: 我看到了您对代码的新编辑,使用 SetConsoleOutputCP(437) 也可以,并且可以工作。