fread失败问题(IOS 64位环境)

时间:2016-10-05 04:51:31

标签: ios c 64-bit fread

我的问题是,下面的代码在其他平台上运行正常,但在iOS 64bit上却没有。

详细信息如下:

LoginServlet

当我尝试使用fgetc()(仅用于测试)时,结果相同。

奇怪之处在于,返回值ferror()。 我心里的价值意味着ESRCH(“没有这样的过程”),而且我发现的几乎所有文件都说这个值与文件阅读任务无关。

请给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

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将其截断为文件的精确长度<) / p>

编译并运行

$ 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。因此,您的问题在于您未显示的代码。调整代码,使其可以编译和运行,并显示一个最小的测试用例,就像这个重现问题的那个。有关如何操作的指导,请阅读:

相关问题