Fread на ільве не чытаць, калі даўжыня> 2G

Since Macosx Lion fread does not read file with length > 2G (int size, 2'147'483'648 bytes). It worked for years with macosx snow leopard.

Я напісаў праграму, каб праверыць гэта:

#include 
#include 
#include 

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;
}

проста запусціце:

  • ./ входной_файл выходной_файл МПГ
  • OpenSSL ша входной_файл
  • OpenSSL ша выходной_файл

Там няма памылкі. Даўжыня 2 файла аднолькавыя. Гэтыя два адбітка пальца не супадаюць. (Паказальнік добра вылучаюцца і пісаць у файл_выводе) Яго толькі з FREAD, ня FWRITE.

я не разумею гэтую праблему.

I just see this program (i don't know if apple use this one on Lion) and r variable is defined as int. http://www.opensource.apple.com/source/Libc/Libc-186/stdio.subproj/fread.c

Дзякуй за адказы

3
З'яўляецца OSX 32-біт або 64-біт? Калі гэта 32-бітная, няма ніякіх падстаў чакаць, каб быць у стане прачытаць больш за 2 Гб ці нават быць у стане стварыць аб'ект, які большую памяць.
дададзена аўтар R.., крыніца

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
$ 
1
дададзена
<Код>/DEV/нуль быў дрэнны выбар для стварэння тэставага файла тут. З вельмі вялікі Таноса выклікі будуць цягнуць у нулявых старонак з ядра, калі Fread быў зламаны вы будзеце адчуваць файл нулёў на прастору памяці нулёў.
дададзена аўтар Zan Lynx, крыніца

Падобна на тое, вы не кампіляцыі ў 64-бітным рэжыме. Паглядзіце на аргумент каманднага радка або опцыю ў любы кампілятар вы выкарыстоўваеце. Для таго, каб пераканацца, што вы збіраеце ў правільным рэжыме, Е ( "% d \ п», SizeOf (INT)); і паглядзець, калі ён паказвае вам, што вы чакалі.

1
дададзена

printf("%d\n", sizeof(int)); gcc -Wall Typ.c -o Typ warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long --> 4

Дзякуй Джонатан.

я знаходжуся на 10.7.2 і Xcode 4.2

НКУ --version i686-яблык-darwin11-LLVM-GCC-4.2 (GCC) 4.2.1 (на аснове Apple Inc. пабудаваць 5658) (LLVM пабудаваць 2336.1.00)

я зрабіць НКУ TestFile -o TestFile.o і нават дакладна так, як вы зрабілі: / USR/бен/ССАДПЗ -g -std = c99 -Wall -Wextra 2gb.c -o 2gb і я дадаць -m64 пасля

і я зноў 2 Differents пальцаў.

Xcode 3.6.2 быў выдалены з дапамогай Суда/Бібліятэка/дэўсталёўка-DevTools --mode = усе і Xcode 4.2 ўсталяваць пасля.

я бягу на іншы МПГ карыстальніка нядаўна створанага (прычына $ шляху можа быць) і яго ж.

Не разумею.


Apple, каманда адказ пасля таго, як паведамленне аб гэтай памылцы

Прывітанне Stéphane,

Гэта прытрымлівацца да Bug ID # 10376104. Пасля далейшага расследавання было ўстаноўлена, што гэта вядомая праблема, якая ў цяперашні час расследуецца тэхнікай. Гэтая праблема была пададзеная ў нашай базе дадзеных памылак пры першапачатковым Bug ID # 6434977. Арыгінальны нумар памылкі выкарыстоўваецца для адсочвання гэтага дубліката пытання можна знайсці ў раздзеле Звязаных Праблемнай Праблемы падрабязную справаздачу пра памылку ў.

Дзякуй за адпраўку гэтага паведамлення пра памылку. Мы сапраўды цэнім вашу дапамогу, дапамагаючы нам выявіць і ізаляваць памылкі.

З найлепшымі пажаданнямі,

Распрацоўшчык Bug Reporting Team Адносіны з распрацоўшчыкамі Apple, ва ўсім свеце

0
дададзена
Я стварыў новы раздзел, усталяваць Lion, абнаўленне Lion (10.7.2), усталяваць Xcode (4.2). і .. яго ж праблема зноў. (Неверагодна) ... так што я прышлю памылку ў Apple, .. мая машына MacPro 6 ядраў верасня 2010.
дададзена аўтар Stephane, крыніца
Apple, каманда адказ пасля таго, як паведамляць пра гэта bug- гл вышэй тэкст (больш за 556 сімвалаў)
дададзена аўтар Stephane, крыніца
Яго Fixed !! Так, яны зрабілі гэта! Гэта зойме больш за 2-х гадоў, але гэтая праблема вырашаецца ў цяперашні час. (На Mavericks самую апошнюю)
дададзена аўтар Stephane, крыніца