【问题标题】:fread failure issue (IOS 64bit environment)fread 失败问题(IOS 64bit 环境)
【发布时间】:2016-10-05 04:51:31
【问题描述】:

我的问题是,下面的代码在其他平台上运行良好,但在 iOS 64 位上却不行。

详情在以下代码中:

    //FILE* f = fopen( .. ); // f is opened and already be used successfully. 
    //Size of target file is near 50mb

    fseek(f, 0, SEEK_END);
    // print ftell(f) -> 53394002
    fseek(f, -1024, SEEK_END);
    // print ftell(f) -> 53392978

    fread(buf, 1, 1024, f); // returns 0.
    ferror(f) // returns 3. 

    // print ftell(f) -> 53392978
    fseek(f, 0, SEEK_END);
    // print ftell(f) -> 53394002

当我尝试使用 fgetc()(仅用于测试)时,结果是一样的。

奇怪的是,ferror() 的返回值为 3。 我觉得这个值意味着 ESRCH(“没有这样的过程”),我发现的几乎所有文件都说这个值与文件读取任务无关。

能给我一些建议吗?

【问题讨论】:

    标签: ios c 64-bit fread


    【解决方案1】:

    ferror() 的返回值不是错误号;它为零表示没有错误,非零表示错误。如果您想知道错误号,请查看errno。最好显示完整的代码,包括对来自fseek() 的返回值的测试等等。

    我无法在我的 Mac 上重现您的问题。我创建了一个与您的大小相同的大文件:

    $ ls -l big.file
    -rw-r--r--  1 jleffler  staff  53394002 Oct  5 19:57 big.file
    $
    

    代码

    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
        const char *filename = "big.file";
        if (argc > 1)
            filename = argv[1];
        FILE *f = fopen(filename, "r");
        if (f == 0)
        {
            perror(filename);
            return 1;
        }
    
        if (fseek(f, 0, SEEK_END) != 0)
            perror("fseek END 1");
        printf("EOF %ld\n", ftell(f));
        if (fseek(f, -1024, SEEK_END) != 0)
            perror("fseek END 2");
        printf("POS %ld\n", ftell(f));
    
        char buf[1024];
        size_t n = fread(buf, 1, 1024, f);  // OP reports returns 0.
        printf("N = %zu\n", n);
        int r = ferror(f);                  // OP reports returns 3. 
        printf("r = %d\n", r);
    
        printf("POS %ld\n", ftell(f));
        if (fseek(f, 0, SEEK_END) != 0)
            perror("fseek END 3");
        printf("POS %ld\n", ftell(f));
    
        fclose(f);
        return 0;
    }
    

    这不是很好的代码:它不会在检测错误时放弃(perror() 打印后返回);它不显示读取的数据,因此可以将其与文件中的内容进行比较(使用随机数据生成器生成,然后使用 GNU truncate 截断为文件的精确长度)

    编译运行

    $ gcc -O3 -g -std=c11 -Wall -Wextra -Werror bf19.c -o bf19  
    $ ./bf19
    EOF 53394002
    POS 53392978
    N = 1024
    r = 0
    POS 53394002
    POS 53394002
    $
    

    这表明该代码可以在我的运行 macOS Sierra 10.12 和 GCC 6.2.0 的 Mac 上运行。因此,您的问题在于您未显示的代码。调整您的代码,以便它可以编译和运行,并显示一个最小的测试用例,比如这个重现问题的测试用例。有关如何操作的指导,请阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多