从 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) 也可以,并且可以工作。
我想知道如何从 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) 也可以,并且可以工作。