【问题标题】:Read and print special ascii characters from file in c从 c 中的文件读取和打印特殊的 ascii 字符
【发布时间】:2021-06-11 07:04:28
【问题描述】:

我想知道如何从 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;
}

```


【问题讨论】:

  • 无关:试试FIGlet
  • 那些不是“特殊的 ASCII 字符”。 ASCII 是纯粹的 7 位字符集。

标签: c ascii


【解决方案1】:

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

编码 > 字符集 > 中欧 > OEM 852

之后,当您将特殊字符粘贴到 notepad++ 中时,文本文件会将它们保存为 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) 也可以,并且可以工作。

【讨论】:

  • 不幸的是不起作用,但感谢您的帮助。我在 Visual Studio 中得到一个 stream.valid() 错误,在代码块中它打印出“Γûä”。它仍然没有做任何事情,我按照正确的顺序按照您的步骤操作,但没有。感谢您提供良好的功能
  • 能否将您的文本文件上传到hexed.it,这样我们就可以绝对确定该文件没有问题?它会逐字节显示文件内容,以便您准确了解文件中的内容。
  • 另外,在 Visual Studio 中,如果您使用 fopen,您应该在第一行添加 #define _CRT_SECURE_NO_WARNINGS
  • 我确实使用过_CRT_SECURE_NO_WARNINGS。也被诅咒了。它只是一堆经典的“Γυe”。该文件只有 (▀, █, ▄) 和一些普通的普通文本
  • 好的,所以如果您的文件是这样的pasteboard.co/JSrhyqX.png 问题可能在控制台代码页中。您能否运行 cmd 并键入显示默认控制台代码页的命令 chcp
猜你喜欢
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2015-04-26
相关资源
最近更新 更多