Фред на льве не читает, когда длина> 2G - PullRequest
3 голосов
/ 28 октября 2011

Поскольку утилита Macosx Lion не читает файл длиной> 2 ГБ (размер 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 ]

1 голос
/ 29 октября 2011

У меня отлично работает на 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
$ 
1 голос
/ 29 октября 2011

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

0 голосов
/ 29 октября 2011

printf ("% d \ n", sizeof (int));gcc -Wall Typ.c -o Типовое предупреждение: формат "% d" ожидает тип "int", но аргумент 2 имеет тип "long unsigned int" предупреждение: формат "% d" ожидает тип "int", но аргумент 2 имеет тип'long -> 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 для другого пользователя, только что созданного (возможно, из-за пути $) и того же.

Я не понимаю.


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

Здравствуйте, Стефан,

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

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

С наилучшими пожеланиями,

Команда разработчиков отчетов об ошибках в работе с разработчиками Apple Worldwide Developer Relations

...