1

我正在尝试使用 c++ 中的 fget() 逐行读取文本文件,并且“加减号”符号显示为“?” 象征。它与编码有什么关系。我尝试切换到 Unicode,但结果更糟。请帮忙

谢谢。编辑:这是我的代码:

#define AMINOACIDS "ARNDCQEGHILKMFPSTWYV"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int getAmino(char* index, int j_index, int i_index){

    int j = 0;  
    char *buffer = (char*)malloc(sizeof(char) * 100);
    FILE *file; 
    file = fopen("blosum50.txt", "r");

    if(file == NULL){   
        perror("Error at opening the file!");
    }else{

        while (!feof(file))
        {
            printf("In while:\n");
            if (fgets(buffer , 100 , file) == NULL ){       
                break;
            }

            fputs (buffer , stdout);

            if(j == j_index){
                break;
            }
            j++;
        }
        fclose (file);
     }
   return 0;
   }
int main(void){
   char *aMatrix = (char*)malloc(sizeof(char) * (21));
    strcpy(aMatrix, AMINOACIDS);
    getAmino(aMatrix, 0, 1);
    return 0;
}

然后,当我按 Ctrl+S 时,它会弹出一条消息: 在此处输入图像描述

如果我按否,符号将显示为“?” 象征: 在此处输入图像描述

如果我按是,它们会显示如下: 在此处输入图像描述

这是我的文件的内容:

5 -2 -1 -2 -1 -1 -1 0 -2 -1 -2 -1 -1 -3 -1 1 -0 -3 -2 0 -2 7 -1 -2 -4 1 0 -3 0 -4 -3 3 -2 -3 -3 -1 -1 -3 -1 -3 -1 -1 7 2 -2 0 0 0 1 -3 -4 0 -2 -4 -2 1 0 -4 -2 -3 -2 -2 2 8 -4 0 2 -1 -1 -4 -4 -1 -4 -5 -1 0 -1 -5 -3 -4 -1 -4 -2 -4 13 -3 -3 -3 -3 -2 -2 -3 -2 -2 -4 -1 -1 -5 -3 -1 -1 1 0 0 -3 7 2 -2 1 -3 -2 2 0 -4 -1 0 - 1 -1 -1 -3 -1 0 0 2 -3 2 6 -3 0 -4 -3 1 -2 -3 -1 -1 -1 -3 -2 -3 0 -3 0 -1 -3 -2 -3 8 -2 -4 -4 -2 -3 -4 -2 0 -2 -3 -3 -4 -2 0 1 -1 -3 1 0 -2 10 -4 -3 0 -1 -1 -2 -1 -2 -3 2 -4 -1 -4 -3 -4 -2 -3 -4 -4 -4 5 2 -3 2 0 -3 -3 -1 -3 -1 4 -2 -3 -4 -4 -2 -2 -3 -4 -3 2 5 -3 3 1 -4 -3 -1 -2 -1 1 -1 3 0 -1 -3 2 1 -2 0 -3 -3 6 -2 - 4 -1 0 -1 -3 -2 -3 -1 -2 -2 -4 -2 0 -2 -3 -1 2 3 -2 7 0 -3 -2 -1 -1 0 1 -3 -3 - 4 -5 -2 -4 -3 -4 -1 0 1 -4 0 8 -4 -3 -2 1 4 -1 -1 -3 -2 -1 -4 -1 -1 -2 -2 -3 - 4 -1 -3 -4 10 -1 -1 -4 -3 -3 1 -1 1 0 -1 0 -1 0 -1 -3 -3 0 -2 -3-1 5 2 -4 -2 -2 0 -1 0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -2 -1 2 5 -3 -2 0 -3 -3 - 4 -5 -5 -1 -3 -3 -3 -3 -2 -3 -1 1 -4 -4 -3 15 2 -3 -2 -1 -2 -3 -3 -1 -2 -3 2 - 1 -1 -2 0 4 -3 -2 -2 2 8 -1 0 -3 -3 -4 -1 -3 -3 -4 -4 4 1 -3 1 -1 -3 -2 0 -3 -1 5

4

2 回答 2

0

Visual Studio 中的“另存为 Unicode”将文件保存为带有“字节顺序标记”(U+FEFF) 前缀的 UTF-8。这就是为什么您5在第二个示例中看到 3 个字符之前的原因。

我从混乱的字符中猜测您的“加减号”实际上是 ∓ 不是 ± ?因为它们似乎被正确读取,只是没有正确解释。您正在传递fputs原始字符串,它需要 ASCII。不是 UTF-8。

MultiByteToWideChar可以转换为 UTF-16,然后您可以将其传递给WriteConsoleW. Microsoft C++ 将 Unicode 输出弄得一团糟,这很奇怪,因为 Microsoft Windows 本身就可以做到这一点。

于 2013-11-08T09:31:19.253 回答
-1

加减号不是标准 ASCII 的一部分(即从 0-127,128-255 是扩展的 ASCII)。

加减的扩展 ASCII 值是十进制的 241。

Unicode 代码点是 U+00B1(即十六进制)。

当您将文件保存为 Unicode 时,它​​看起来像是 UTF-16 编码。在您的代码中,您尝试以 ASCII 模式读取的内容。这就是为什么输出看起来像这样。

在 Windows 上,它应该将字符 241(十进制)显示为±. 因此,如果它是 ASCII 中的 241,它应该看起来像 ±。

因此,请使用一些十六进制编辑器检查文件的字符 ASCII 值或 unicode 值。这可以给你更好的画面。

于 2013-11-08T08:41:00.323 回答