2010-07-29 2 views
0

저는 C++ 초보자입니다. 나는 그것을 배워야 만하는 직장에서 새로운 프로젝트를 가졌으므로 나는 내 이해를 테스트하기 위해 몇 가지 일을 시도하고있다. 이 문제는 파일을 읽고 화면에 인쇄하려고합니다. 슈퍼 간단하고, 그냥 잘하려고하고 내가 사용하고있는 기능을 이해하려고. MS Word 문서의 일부 텍스트를 메모장 (* .txt) 파일로 복사했으며이 * .txt 파일을 읽으려고합니다. 단어 문서의 모든 텍스트는 굵게 표시되어 있지만 '특이한'문자는 없습니다. 굵은 글씨 "-"기호를 제외한 모든 내용이 화면에 인쇄됩니다. 이 문자는 모자 문자 ("확장 ASCII 코드"150)와 함께 "u"로 인쇄됩니다. 내 배열 (이 150되어야합니다)이 문자의 정수 값을 인쇄하려고하지만 -106 얻을. 이 부호가있는 정수는 부호없는 정수 150과 동일한 비트를가집니다. 제 질문은 출력을 150이라고하는 방법입니다. 여기에 내 코드입니다 :서명되지 않은 char *이 ifstream :: read와 함께 작동하지 않는 이유는 무엇입니까?

This file is 80 bytes. 
    The first 57 characters of this file are: 

    STATUS REPORT 
    PERIOD 01 u 31 JUL 09 

    TASK 310: APPLIC 

    ASCII code for char in input1[24] is: 32 
    ASCII code for char in input1[25] is: -106 
    ASCII code for char in input1[26] is: 32 
    ASCII code for char in input1[25] as unsigned int: 4294967190 
    ASCII code for char in input1[25] as unsigned short int: 65430 
    ASCII code for char in input1[25] as short int: -106 

그래서 서명으로 항상 읽기 "는이 int로"가 나타납니다 : 모든이에 대한

 #include <iostream> 
     #include <fstream> 
     using namespace std; 

     int main() { 
     unsigned char* input1; 
     int input1size = 57; 
     ifstream file("hello_world2.txt",ios::binary | ios::ate); 
     if (file.is_open()){ 
      int size; 
      size = (int) file.tellg(); 
      cout <<"This file is " << size << " bytes." << endl; 
      file.seekg(0,ios::beg); 
      input1 = new unsigned char[input1size]; 
      file.read(input1, input1size); 
      cout << "The first " << input1size <<" characters of this file are:" << endl<<endl; 
      for (int i=0; i<input1size; i++) { 
      cout << input1[i]; 
     } 
     cout<<endl; 
     } 
     else { 
     cout <<"Unable to open file" << endl; 
     int paus; 
     cin>>paus; 
     return 0; 
     } 
     file.close(); 
     int charcheck = 25; 
     int a=0; 
     int a1=0; 
     int a2=0; 
     unsigned int a3=0; 
     unsigned short int a4=0; 
     short int a5=0; 
     a = input1[charcheck]; 
     a1 = input1[charcheck-1]; 
     a2 = input1[charcheck+1]; 
     a3 = input1[charcheck]; 
     a4 = input1[charcheck]; 
     a5 = input1[charcheck]; 
     cout <<endl<<"ASCII code for char in input1[" << charcheck-1 <<"] is: " << a1 << endl; 
     cout <<endl<<"ASCII code for char in input1[" << charcheck <<"] is: " << a << endl; 
     cout <<endl<<"ASCII code for char in input1[" << charcheck+1 <<"] is: " << a2 << endl; 
     cout <<endl<<"ASCII code for char in input1[" << charcheck <<"] as unsigned int: " << a3 << endl; 
     cout <<endl<<"ASCII code for char in input1[" << charcheck <<"] as unsigned short int: " << a4 << endl; 
     cout <<endl<<"ASCII code for char in input1[" << charcheck <<"] as short int: " << a5 << endl; 
     int paus; 
     cin>>paus; 
     return 0; 
     } 

출력하는 것 같습니다. "a"를 부호없는 상태로 만들려고하면 char의 8 비트 중 1 비트를 남겨 둡니다. 왜 이런거야? 질문의 길이는 유감스럽게 생각합니다. 단지 자세하게 설명하려고합니다. 감사!

답변

0

당신이 다루는 것은 char가 int로 승격 될 때 발생하는 sign-extension입니다. 변수.

모든 상위 비트는 char의 작은 저장 장치와 동일한 음수 값을 유지하려면 1로 설정해야합니다.

+0

그래서 부호없는 값 150을 출력하는 방법이 있습니까? 포인터 input1을 "unsigned char * input1;"으로 선언하려고하면 (원래 게시물의 코드에 게시 된 것처럼), 오류가 발생했습니다. :: read '매개 변수 1을'unsigned char * '에서'char * '로 변환 할 수 없습니다. – Jade

+0

예. 마스크를 사용하여 : a3 = input1 [charcheck] & 0xff;'확장 된 부호 하나를 제거하십시오. 그럼 당신의 시창은 150을 표시합니다. –

+0

아, 고마워요! 나는이 시점에서 마스크에 대해 아무것도 모른다. 그러나 이제는 검색 할 방향이있다. 도와 줘서 고마워! – Jade

관련 문제