2012-03-03 18 views
5

Tôi có một câu hỏi đơn giản khiến tôi khó hiểu.Cách đọc một byte và lưu giá trị ASCII của byte theo số nguyên trong C++

Mục tiêu: Tôi muốn đọc một byte nhất định từ tệp (nói byte đầu tiên) và tạo int x với giá trị ASCII của byte đó. Vì vậy, ví dụ, nếu byte/ký tự là 'a', tôi muốn x là 97 (= 61 trong hex). Tôi đã đọc những điều sau byte đầu tiên của tập tin example.txt:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(){ 
    unsigned int x; 
    unsigned char b; 
    ifstream myFile ("example.txt", ios::out | ios::binary); 
    myFile.seekg (0, ios::beg); 
    myFile >> b; 
    x = (unsigned int)b; 
    cout << hex << x; 
    return b; 
} 

Vấn đề: Nếu byte đầu tiên được đại diện bởi 08, sau đó thực sự tôi nhận được một sản lượng 8. Nhưng nếu byte được biểu diễn bởi 09, sau đó tôi nhận được 0. Tôi đã nhận thấy rằng tôi dường như nhận được các byte sau trừ khi byte đó cũng là 09. Tôi không biết nếu vấn đề của tôi là chỉ khi byte được đại diện trong ASCII bởi 09.

Câu hỏi: Vậy làm thế nào để tôi đọc nói byte đầu tiên (hoặc thứ ba hoặc thứ gì đó) từ một tệp và tạo một giá trị int với giá trị ASCII của byte đó?

(Tôi đang sử dụng Windows XP)

+0

Tại sao bạn không chỉ đọc vào một 'char'? –

+0

@ Cuộc đua nhẹ nhàng trong quỹ đạo: Cảm ơn nhận xét. Tôi đã cố gắng để đọc vào một char, nhưng tôi muốn giá trị ascii của mỗi nhân vật và khi giá trị là 09, tôi đã nhận được giá trị 0. (nếu điều đó có ý nghĩa?) – Thomas

Trả lời

3

Điều này sẽ khắc phục sự cố.

myFile >> noskipws >> b; 
2

Thử đọc bằng cách sử dụng ifstream::read thay vì operator>>. Điều này đã làm việc cho tôi:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(){ 
    unsigned int x; 
    unsigned char b; 
    ifstream myFile ("example.txt", ios::out | ios::binary); 
    myFile.seekg (0, ios::beg); 
    myFile.read(reinterpret_cast<char*>(&b), sizeof(b)); 
    x = (unsigned int)b; 
    cout << hex << x; 
    return b; 
} 
3

Vài gợi ý:

  • Kiểm tra nếu tập tin đã thực sự được mở ra. Nếu không, hãy đảm bảo tệp nằm trong thư mục hiện tại hoặc cung cấp đường dẫn đầy đủ.
  • Bạn có thể muốn ios::in (không phải ios::out).
  • Sử dụng noskipws trừ khi bạn thực sự muốn bỏ qua khoảng trắng.
  • Mục đích của việc trả lại nhân vật là gì? Công ước là interpret a non-zero exit code as a failure (mặc dù phải thừa nhận rằng, không có tiêu chuẩn nghiêm ngặt về điều này).

Các chương trình sau đây đọc nhân vật thứ 4 và in giá trị HEX của nó chỉ tốt cho tôi:

#include <iostream> 
#include <fstream> 
#include <stdlib.h> 

using namespace std; 

int main() { 

    ifstream myFile("<path>\\example.txt", ios::in | ios::binary); 

    if (myFile) { 

     unsigned char b; 
     myFile.seekg(3) >> noskipws >> b; 

     if (myFile) { // File was long enough? 
      unsigned int x = b; 
      cout << hex << x; 
      return EXIT_SUCCESS; 
     } 

    } 

    return EXIT_FAILURE; 

} 

(Thay thế <path> với đường dẫn thực tế.)

+0

Cảm ơn lời đề nghị. Các giải pháp noskipws làm việc cho tôi. Trả lại nhân vật chỉ là một sai lầm khi tôi chơi đùa với mọi thứ. Tại sao tôi nên sử dụng ios :: thay vì ios :: khi tôi muốn đọc từ tệp? (bạn có thể đã nhận ra rằng tôi mới đến C++) – Thomas

+1

@ThomasM Bởi vì bạn muốn "đầu vào" từ tập tin, không phải "đầu ra" cho nó. –

+0

Bạn đã đúng! Tôi đã hiểu lầm điều đó. Cảm ơn! Tôi tự hỏi tại sao nó hoạt động sau đó ... – Thomas