所以我正在尝试读取已经提供的文件系统磁盘。
所以,我想要做的是从文件系统中读取1044字节。我目前正在做的是:
if (fp = fopen("filesysFile-full", "r")) {
fseek(fp, 1044, SEEK_SET); //Goes to 1024th byte
int check[sizeof(char)*4]; //creates a buffer array 4 bytes long
fread(check, 1, 4, fp); //reads 4 bytes from the file
printf("%d",check); //prints
int close = fclose(fp);
if (close == 0) {
printf("Closed");
}
}
检查应该打印的值是1.但是我得到负值,每次运行文件时都会不断变化。我不明白我做错了什么。我采取正确的方法来读取磁盘的字节并打印它们。
我基本上想要做的是读取磁盘的字节,并读取某些字节的值。这些字节是帮助我理解磁盘结构/格式的字段。
任何帮助将不胜感激。 谢谢。
答案 0 :(得分:1)
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(& check,...)的变化。 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");
}
}
在这种情况下,check(不带括号)是指向数组的指针,这就是我将fread更改回fread(check,...)的原因。
希望这有帮助!
答案 1 :(得分:1)
这一行:
int check[sizeof(char)*4];
分配一个4个整数的数组。
因此检查的类型是int *,所以这一行:
printf("%d",check);
打印数组的地址。
你应该做什么把它分配为int:
int check;
然后进入它:
fread(&check, 1, sizeof(int), fp);
(顺便提一下,这段代码假设int是4个字节。)