我有一个彩虹桌,我已经存储到一个硬盘。我正在读取文件,并试图将其传输到结构中。我有另一个转储可执行文件,它显示彩虹表中的所有结构。为了测试fread()和fseak(),我在我想要查看的特定索引上找到了一个结构,但是当我这样做时,我得到了所有的0。
我想我用错了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct data {
unsigned char a[16];
char b[20];
} data;
int main(int argc, char **argv){
FILE *f = fopen( *(argv + 1), "rb");
data e = { .a = ""};
fseek(f, 35929 * sizeof(struct data), SEEK_SET);
fread(&e, sizeof(struct data), 1, f);
printf("%s\n", e.a);
return 0;
}发布于 2015-11-24 06:58:15
使用fseek不会立即显示为什么要读取文件中请求的偏移量的所有零。但是,没有办法知道问题可能是什么,因为在代码中的任何关键操作都没有成功或失败的验证。无法判断失败是由于未能打开f,还是文件包含足够数量的字节以支持您的请求偏移,或者fseek或fread是否在该偏移量上成功或失败,等等……
要开始了解问题所在,必须对每个必要的操作进行验证,直到printf为止。至少,在通过调试器运行代码之前,您会对代码的失败有一些合理的了解。(不可)
解决问题的第一步(以及正确的代码验证)是检查每个被调用函数的返回,以确保其成功,并根据需要进一步验证值的合理性。所需最低限度验证的一个例子将类似于:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct data {
unsigned char a[16];
char b[20];
} data;
int main(int argc, char **argv){
FILE *f = fopen (argv[1], "rb");
data e = { .a = {0}, .b = {0} };
long int size = 0;
if (!f) {
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
if (fseek (f, 0, SEEK_END)) {
fprintf (stderr, "error: fseek SEEK_END failed\n.");
return 1;
}
if ((size = ftell (f)) == -1){
fprintf (stderr, "error: ftell failed to return size of file\n.");
return 1;
}
rewind (f);
if ((unsigned long)size < 35929 * sizeof e) {
fprintf (stderr, "error: offset exceeds file size '%ld'\n.", size);
return 1;
}
if (fseek (f, 35929 * sizeof e, SEEK_SET)) {
fprintf (stderr, "error: fseek SEEK_SET failed\n.");
return 1;
}
if (!fread (&e, sizeof e, 1, f)) {
fprintf (stderr, "error: fread failed to read data into 'e'\n.");
return 1;
}
printf("%s\n", e.a);
fclose (f);
return 0;
}给它一个尝试,并报告与更多的信息,这里的每个人都乐意提供任何额外的帮助,你可能需要。
https://stackoverflow.com/questions/33885897
复制相似问题