我正在创建一个函数来读取包含一些转储数据的文件(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"
EDIT :如果我不使用unsigned char,则前8个值(全部为245)将读为-11 .
3 回答
我想,您可能必须使用unsigned char和unsigned int来获得正确的结果 . 在您的代码中,您读取的字节被解释为有符号值 . 我假设你不打算这样做 .
您的错误似乎涵盖了使用
char*
forch
. 当您尝试输出它时,将打印所有字符,直到第一个零值 .普通
char
可以是有符号或无符号的,具体取决于编译器 . 要获得一致(且正确)的结果,可以在分配给int
之前将值转换为unsigned char
.