Фред на льве не читает, когда длина> 2G

Так как Macosx Lion fread не читает файл с длиной> 2G (размер int, 2'147'483'648 байт). Это работало в течение многих лет с Macosx Snow Leopard.

Я написал программу для проверки:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
FILE   *fin = NULL, *fout = NULL;
char   *ptr = NULL;
size_t len;
fpos_t flen;

if (!(fin = fopen(argv[1], "rb")))
{
    printf("The input file: %s could not be opened\n", argv[1]);
    return -1;
}
if ((fout = fopen(argv[2], "rb")))
{
    printf("The output file %s already exist\n", argv[2]);
    fclose(fin);
    return -1;
}
if (!(fout = fopen(argv[2],"wb")))
{
    printf("Cannot write on output file %s\n", argv[2]);
    fclose(fin);
    return -1;
}

fseek(fin, 0, SEEK_END);
fgetpos(fin, &flen);
len = flen;
printf("Input file length : %zd\n", len);
fseek(fin, 0, SEEK_SET);

if (!(ptr = malloc(len))) 
{
    printf("Canot allocate %zd bytes\n", len);
    fclose(fin);
    fclose(fout);
    return -1;
}
if (fread(ptr, sizeof(char), len, fin) != len)
{
    printf("Cannot read file\n");
    fclose(fin);
    fclose(fout);
    free(ptr);
    return -1;
}
fclose(fin);
if (fwrite(ptr, sizeof(char), len, fout) != len) 
{
    printf("Cannot write file\n");
    fclose(fout);
    free(ptr);
    return -1;
}
free(ptr);
fclose(fout);

return 1;
}

просто беги:

  • ./pgm inputfile outputfile
  • входной файл openssl sha
  • openssl sha выходной файл

Там нет ошибки. Длина двух файлов одинакова. Два отпечатка пальца не совпадают. (Указатель хорошо выделен и записывается в выходной файл). Он только с fread, а не fwrite.

Я не понимаю проблемы.

Я просто вижу эту программу (я не знаю, использует ли Apple эту на Lion), а переменная r определяется как int. http://www.opensource.apple.com/source/Libc/Libc-186/stdio.subproj/fread.c

Спасибо за ответы

3 ответа

У меня отлично работает на MacOS X Lion (10.7.2) с XCode 4.2. Исполняемый файл представляет собой 64-битную программу. Вы должны убедиться, что ваш тоже.

$ make 2gb
/usr/bin/gcc -g -std=c99 -Wall -Wextra 2gb.c -o 2gb
2gb.c:5: warning: unused parameter ‘argc’
$ file 2gb
2gb: Mach-O 64-bit executable x86_64
$ dd if=/dev/zero of=input bs=1m count=3072
./2g3072+0 records in
3072+0 records out
3221225472 bytes transferred in 42.940363 secs (75016261 bytes/sec)
$ ls -l input
./2gb -rw-r--r--  1 jleffler  staff  3221225472 Oct 29 00:48 input
$ ./2gb input output
Input file length : 3221225472
$ openssl sha input
SHA(input)= c93bf6713a90e34554311f0a9e43cfd1f153475a
$ openssl sha output
SHA(output)= c93bf6713a90e34554311f0a9e43cfd1f153475a
$ ls -l input output
-rw-r--r--  1 jleffler  staff  3221225472 Oct 29 00:48 input
-rw-r--r--  1 jleffler  staff  3221225472 Oct 29 00:49 output
$ rm input output
$ /usr/bin/gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$

И, когда принудительно в 32-битной компиляции:

$ rm 2gb
$ make CC='/usr/bin/gcc -m32' 2gb
/usr/bin/gcc -m32 -g -std=c99 -Wall -Wextra 2gb.c -o 2gb
2gb.c:5: warning: unused parameter ‘argc’
$ dd if=/dev/zero of=input bs=1m count=3072
3072+0 records in
3072+0 records out
3221225472 bytes transferred in 38.326753 secs (84046397 bytes/sec)
$ ./2gb input output
Input file length : 0
$ ls -l input
-rw-r--r--  1 jleffler  staff  3221225472 Oct 29 00:57 input
$ 

Похоже, вы не компилируете в 64-битном режиме. Ищите аргумент командной строки или параметр для любого компилятора, который вы используете. Чтобы убедиться, что вы компилируете в правильном режиме, printf("%d\n", sizeof(int)); и посмотрим, покажет ли это то, что вы ожидали.

printf("%d\n", sizeof(int)); gcc -Wall Typ.c -o Типовое предупреждение: формат "% d" ожидает тип "int", но аргумент 2 имеет тип "long unsigned int" предупреждение: формат "% d" ожидает тип "int", но аргумент 2 имеет тип 'долго -> 4

Спасибо Джонатан.

я на 10.7.2 и xcode 4.2

gcc - версия i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (на основе Apple Inc., сборка 5658) (сборка LLVM, 2336.1.00)

я делаю gcc TestFile.c -o TestFile.o и даже точно так же, как вы это сделали: /usr/bin/gcc -g -std=c99 -Wall -Wextra 2gb.c -o 2gb и добавляю -m64 после

и у меня опять 2 разных отпечатка пальца.

xcode 3.6.2 был удален с помощью sudo /Library/uninstall-devtools --mode=all и xcode 4.2 install после.

я запускаю pgm на другом недавно созданном пользователе (возможно, причина $ path) и на том же.

я не понимаю


Ответ команды Apple после сообщения об этой ошибке

Привет Стефан,

Это продолжение идентификатора ошибки # 10376104. После дальнейшего расследования было установлено, что это известная проблема, которая в настоящее время исследуется с помощью технических средств. Эта проблема была сохранена в нашей базе данных ошибок под исходным идентификатором ошибки # 6434977. Оригинальный номер ошибки, используемый для отслеживания этой повторяющейся проблемы, можно найти в разделе "Связанные проблемы" в представлении "Сведения о проблеме" в отчете об ошибках.

Спасибо за отправку этого сообщения об ошибке. Мы искренне ценим вашу помощь в обнаружении и обнаружении ошибок.

С уважением,

Команда разработчиков отчетов об ошибках разработчиков по всему миру

Другие вопросы по тегам