【问题标题】:How to read a byte and save ASCII value of byte in integer in c++如何在c ++中读取字节并将字节的ASCII值保存为整数
【发布时间】:2012-03-21 12:00:55
【问题描述】:

我有一个简单的问题让我感到困惑。

目标:我想从文件中读取给定的字节(比如第一个字节),并使用该字节的 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 由 09 表示时。

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

(我在 Windows XP 上)

【问题讨论】:

  • 你为什么不直接读到char
  • @轨道上的轻盈竞赛:感谢您的评论。我试图读入一个字符,但我想读取每个字符的 ascii 值,当值为 09 时,我得到的值为 0。(如果这有意义?)

标签: c++ char int ascii


【解决方案1】:

这应该可以解决它。

 myFile >> noskipws >> b;

【讨论】:

    【解决方案2】:

    几个建议:

    • 检查文件是否真的被打开了。如果不是,请确保文件位于当前目录中,或提供完整路径。
    • 你可能想要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;
    
    }
    

    (将&lt;path&gt; 替换为实际路径。)

    【讨论】:

    • 感谢您的建议。 noskipws 解决方案对我有用。从我玩东西的时候开始,回归角色只是一个错误。当我想从文件中读取时,为什么要使用 ios::in 而不是 ios::out? (你可能已经意识到我是 C++ 新手)
    • @ThomasM 因为你想从文件中“输入”,而不是“输出”到它。
    • @ThomasM 未定义的行为可能会使您的程序崩溃,或打印莎士比亚的作品,或擦亮您的鞋子;)但它也可能会起作用!这并不意味着您应该依赖它在不同的情况下工作(例如不同的编译器或平台)。
    【解决方案3】:

    尝试使用ifstream::read 而不是operator&gt;&gt; 阅读。这对我有用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 2017-06-27
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多