我正在设置指向同一个文件的3个指针,每个指针将在不同的偏移量中工作。我需要每次从它们中读取一个字节。但是第二个指针的fread总是显示一个负值。
int main(void) {
unsigned int y;
unsigned int u;
unsigned int v;
FILE *yPtr;
FILE *uPtr;
FILE *vPtr;
yPtr = fopen ( "test.bin", "rb");
uPtr = fopen ( "test.bin", "rb");
vPtr = fopen ( "test.bin", "rb");
fread(&y,1,1,yPtr);
fread(&u,1,1,uPtr);
fread(&v,1,1,vPtr);
printf("%x ", y);
printf("%x ", u);
printf("%x ", v);
}我希望:“9f9f9f”,但输出是:"9f ffffcc9f 9f“。
发布于 2019-08-03 17:06:35
在此:
unsigned int y; /* unintialized, default contains garbage data due to automatic storage */在32位系统中,为y保留了4个字节的内存.看起来像是
0x100 0x101 0x102 0x103 let's assume base address of y is 0x100
-----------------------------------
| G | G | G | G | G- garbage
-----------------------------------
y
LSb--> 还有这里
fread(&y,1,1,yPtr);fread()只从yPtr读取1字节并存储到y中。现在看起来就像
0x100 0x101 0x102 0x103
--------------------------------------------
| valid value | G | G | G | G- garbage
--------------------------------------------
y因此,除了第一个字节,其余的字节仍然包含一些中间值。
正确是
fread(&y, 4, 1, yPtr); /* read 4 bytes */或者首先初始化变量。例如,
unsigned int y = 0; /* now if only first byte overwritten, remaining byte contents will be zero */ 或者,如果应用程序的目的是只读取1字节,则使用unsigned char类型而不是unsigned long类型。如:
unsigned char y = 0;同样适用于其他变量u和v &各自的fread()语句。还要检查库函数fopen()和fread()的返回值。
发布于 2019-08-03 16:45:25
unsigneds通常是4-8字节.您只需将1字节读入它们,剩下的就不确定了。
如果您只想读取一个字节,则应该将其读入unsigned char中。
如果您想继续使用unsigned ints,您可以对它们进行预零,然后如果您在一个2的补码机上,就会得到您想要的结果。
在实际代码中,您还应该检查返回值(至少对于fopen和fread)。
发布于 2019-08-03 16:56:51
试试下面的代码。
似乎您正在编写一个大于1字节值的值(取决于CPU),而这个值没有初始化。
一个未签名的字符是1字节,所以您应该不会遇到任何问题:
int main(void) {
unsigned char y = 0, u = 0, v = 0;
FILE *yPtr, *uPtr, *vPtr;
yPtr = fopen ("test.bin","rb");
uPtr = fopen ("test.bin","rb");
vPtr = fopen ("test.bin","rb");
fread(&y,1,1,yPtr);
fread(&u,1,1,uPtr);
fread(&v,1,1,vPtr);
printf("%x %x %x", y, u, v);
}https://stackoverflow.com/questions/57340253
复制相似问题