首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fread()和fread()

使用fread()和fread()
EN

Stack Overflow用户
提问于 2015-11-24 05:11:58
回答 1查看 1.6K关注 0票数 1

我有一个彩虹桌,我已经存储到一个硬盘。我正在读取文件,并试图将其传输到结构中。我有另一个转储可执行文件,它显示彩虹表中的所有结构。为了测试fread()和fseak(),我在我想要查看的特定索引上找到了一个结构,但是当我这样做时,我得到了所有的0。

我想我用错了。

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2015-11-24 06:58:15

使用fseek不会立即显示为什么要读取文件中请求的偏移量的所有零。但是,没有办法知道问题可能是什么,因为在代码中的任何关键操作都没有成功或失败的验证。无法判断失败是由于未能打开f,还是文件包含足够数量的字节以支持您的请求偏移,或者fseekfread是否在该偏移量上成功或失败,等等……

要开始了解问题所在,必须对每个必要的操作进行验证,直到printf为止。至少,在通过调试器运行代码之前,您会对代码的失败有一些合理的了解。(不可)

解决问题的第一步(以及正确的代码验证)是检查每个被调用函数的返回,以确保其成功,并根据需要进一步验证值的合理性。所需最低限度验证的一个例子将类似于:

代码语言:javascript
复制
#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;
}

给它一个尝试,并报告与更多的信息,这里的每个人都乐意提供任何额外的帮助,你可能需要。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33885897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档