【问题标题】:C++ Binary file read issueC++ 二进制文件读取问题
【发布时间】:2011-10-20 18:09:18
【问题描述】:

我正在编写一个函数来读取包含一些转储数据(1 字节值序列)的文件。由于转储值每个为 1 个字节,因此我将它们读取为字符。我以二进制模式打开文件,将数据读取为字符并转换为 int(所以我得到了 ascii 代码)。但是读取的数据不正确(与十六进制编辑器相比)。这是我的代码:

int** read_data(char* filename, int** data, int& height, int& width)
{
    data=new int*[height];
    int row,col;
    ifstream infile;
    infile.open(filename,ios::binary|ios::in);
    if(!infile.good())
    {
        return 0;
    }
    char* ch= new char[width];
    for(row=0; row<height; row++)
    {
        data[row]=new int[width];
        infile.read(ch,width);
        for(col=0; col<width; col++)
        {
            data[row][col]=int(ch[col]);
            cout<<data[row][col]<<" ";
        }
        cout<<endl;
    }
    infile.close();
    return data;
}

您知道这段代码可能有什么问题吗? 我的机器是 windows,我使用的是 Visual Studio 2005,我传递的(确切)文件名是:

"D:\\files\\output.dat"

编辑:如果我不使用 unsigned char,前 8 个值(均为 245)将读取为 -11。

【问题讨论】:

  • 尝试读入 unsigned 字符并转换为 unsigned 整数。
  • 数据应该分配在这个函数之外。
  • @longbkit 这是 C++。根本不应该手动分配数据。
  • @longbkit 在这个函数之外,我负责“数据”。在这个函数中,值被复制到“数据”数组中。所以,数组没有问题,我可以向你保证。
  • 你能不能给我们更多的细节 - 你有什么样的不正确?

标签: c++ visual-studio file


【解决方案1】:

我认为,您可能必须使用 unsigned char 和 unsigned int 才能获得正确的结果。在您的代码中,您读取的字节被解释为有符号值。我猜你不是故意的。

【讨论】:

  • 但是一个字节就是一个字节。确切的 8 字节被复制到 8 字节数组中。然后,当转储的值也是整数时,访问数组的各个元素就不是问题了。
  • 如果转储值小于 127 或者原始值也已签名,那么您是对的。
  • 转储值接近 245...我认为你们都是对的...我需要采用无符号字符...但是当我这样做时,我得到另一个编译错误... read() 需要一个 char*,而不是 unsigned char*
  • @cOda:问题是如果你的字节是 255,你的 char 将是 255 或 -1,这取决于你的平台。但是如果是-1,就会被提升为整数 -1。
  • @cOda:是的,您必须在阅读时投射,或者留下字符并稍后投射:unsigned int value = (unsigned char)(c);
【解决方案2】:

您的错误似乎涵盖了将char* 用于ch。当您尝试输出它时,会打印所有字符,直到第一个零值为止。

【讨论】:

  • 这是我用来在屏幕上打印值的一些调试信息。我编辑了这个问题。立即检查。
  • 这行代码对行进行单独的数据分配:data[row]=new int[width];
【解决方案3】:

一个普通的char 可以是有符号或无符号的,这取决于编译器。要获得一致(且正确)的结果,您可以将值转换为 unsigned char,然后再分配给 int

data[row][col]=static_cast<unsigned char>(ch[col]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2017-09-01
    • 1970-01-01
    • 2017-10-01
    • 2011-09-03
    相关资源
    最近更新 更多