如何读取一个字节并在c ++中保存整数字节的ASCII值

时间:2012-03-03 01:20:59

标签: c++ char int ascii

我有一个令我困惑的简单问题。

目标:我想从文件中读取一个给定的字节(比如第一个字节),并使用该字节的ASCII值生成int x。因此,例如,如果字节/字符是'a',我希望x为97(=十六进制为61)。我有以下内容读取文件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;
}

问题:如果第一个字节用08表示,那么我确实得到了8的输出。但如果字节用09表示,那么我得到0.我注意到我似乎获取以下字节,除非该字节也是09.我不知道我的问题是否仅在字节用ASCII表示时才显示。

问题:那么如何读取文件中的第一个(或第三个或其他)字节,并使用该字节的ASCII值生成一个int?

(我在Windows XP上)

3 个答案:

答案 0 :(得分:3)

这应该解决它。

 myFile >> noskipws >> b;

答案 1 :(得分:3)

一些建议:

  • 检查文件是否实际已打开。如果不是,请确保该文件位于当前目录中,或提供完整路径。
  • 您可能需要ios::in(不是ios::out)。
  • 除非您确实要跳过空格,否则请使用noskipws
  • 归还角色的目的是什么?惯例是interpret a non-zero exit code as a failure(虽然不可否认,对此没有严格的标准)。

以下程序读取第4个字符并打印其HEX值对我来说很好:

#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;

}

(将<path>替换为实际路径。)

答案 2 :(得分:2)

尝试使用ifstream::read代替operator>>进行阅读。这对我有用:

#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;
}