int check[sizeof(char)*4]; //creates a buffer array 4 bytes long
这是不正确的。您正在创建一个由四个整数组成的数组,每个整数通常为32位,然后当您printf(“%d”,检查)时,您正在打印该数组的地址,每次运行程序时该地址可能会发生变化。我想你想要的是:
if (fp = fopen("filesysFile-full", "r")) {
fseek(fp, 1044, SEEK_SET); //Goes to 1024th byte
int check; //creates a buffer array the size of one integer
fread(&check, 1, sizeof(int), fp); //reads an integer (presumably 1) from the file
printf("%d",check); //prints
int close = fclose(fp);
if (close == 0) {
printf("Closed");
}
}
请注意,不是声明一个整数数组,而是声明一个整数。还要注意从fread(check,...)到fread的更改(&检查,...)。 fread的第一个参数是要读取数据的缓冲区地址(在本例中为单个整数)。
请记住,虽然整数可能是32位长,但不能保证。此外,在大多数操作系统中,整数存储与第一盘上至少显著字节,因此,如果磁盘上的数据看起来像这样在字节1044,你将只读取1:
0x01 0x00 0x00 0x00
如果是其他方式,0x00 00 00 01,将读作16777216(0x01000000)。
如果你想读超过一个整数,你可以按如下方式使用数组:
if (fp = fopen("filesysFile-full", "r")) {
fseek(fp, 1044, SEEK_SET); //Goes to 1024th byte
int check[10]; //creates a buffer of ten integers
fread(check, 10, sizeof(int), fp); //reads 10 integers into the array
for (int i = 0; i < 10; i++)
printf("%d ", check[i]); //prints
int close = fclose(fp);
if (close == 0) {
printf("Closed");
}
}
在这种情况下,检查(不带括号)是一个指向数组的指针,这就是为什么我已经将fread改回fread(检查,...)。
希望这会有所帮助!
对于二进制文件,你不需要''rb“'而不是''r”'吗? – Mehrdad 2011-05-31 01:11:57
在Windows上,是的。在Linux或Unix上,不管,但无论如何可移植性可能是一个好主意(以防代码稍后在Windows上使用)。 – MRAB 2011-05-31 01:51:48