2013-11-08 2 views
1

Я пытаюсь прочитать текстовый файл по строке, используя fget() в C++, а символы «плюс-минус» отображаются как «?» символ. Имеет ли это какое-либо отношение к кодировке. Я попытался переключиться на Unicode, но результат хуже. Пожалуйста, помогитеНевозможно прочитать символ «плюс-минус» из файла

Спасибо. EDIT: Это мой код:

#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 всплывает сообщение: enter image description here

Если я нажимаю Нет, символы отображаться как "?" символ: enter image description here

Если я нажимаю Да, они появляются как это: enter image description here

И это содержание моего файла:

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

+7

Показать нам код, показать нам файл. –

+1

Что именно вы имеете в виду «хуже». – Philipp

+1

Какая кодировка имеет файл? И где вы видите '?'? Если вы попытаетесь вывести его на консоль: вы, вероятно, не сможете :) – Theolodis

ответ

-1

символ плюс-минус не является частью стандартный ASCII (то есть от 0-127, 128-255 расширен ASCII).

Расширенное значение ASCII плюс-минус равно 241 в десятичной системе.

Кодовая точка Юникода U + 00B1 (это шестнадцатеричная).

Когда вы сохраняете файл как Unicode, он выглядит как кодировка UTF-16. И в вашем коде то, что вы пытаетесь прочитать в режиме ASCII. Вот почему вывод выглядит следующим образом.

В Windows он должен показывать символ 241 (десятичный) как ±. Итак, если в ASCII 241, это должно выглядеть как ±.

Итак, проверьте значение символа ASCII или значение Unicode файла, используя какой-либо шестнадцатеричный редактор. Это может дать вам лучшую картину.

+0

Это не только то, как он выглядит. Это также влияет на синтаксический анализ. Я получаю всевозможные символы, и я не могу преобразовать их в int. –

+0

Какова ценность этого символа? – doptimusprime

+0

Существует около миллиона расширений для ASCII, поэтому на самом деле не имеет смысла говорить о ** расширенном ASCII. Например. в UTF-8, 0-127 все еще ASCII, но 241 определенно НЕ ±. Вы правы, что ± является 'U + 00B1'. – MSalters

0

«Сохранить как Юникод» в Visual Studio сохраняет файл как UTF-8 с префиксом «Байтовый заказ» (U + FEFF).Вот почему вы видите 3 символа перед 5 во втором примере.

Я угадываю из-за беспорядка символов, что ваш «плюс минус» на самом деле ∓ не ±? Потому что они, кажется, читаются правильно, просто не интерпретируются правильно. Вы передаете fputs необработанную строку, и она ожидает ASCII. Не UTF-8.

MultiByteToWideChar может конвертировать в UTF-16, после чего вы можете перейти на WriteConsoleW. Microsoft C++ делает правильный беспорядок вывода Unicode, что странно, потому что Microsoft Windows изначально может это сделать.

+0

U + FEFF является спецификацией для UTF-16, а не для UTF-8. – doptimusprime

+0

Похоже, вы хотите сказать UTF-16 вместо UTF-8. – doptimusprime

+0

Я использую Microsoft Visual Studio 2010 Professional, и у меня есть только Unicode (UTF-8 без подписи). Ничего не изменилось. –

Смежные вопросы