2011-10-28 12 views
3

MacOSXのライオン関数freadは、長さを持つファイルを読み込まないので> 2G(int型のサイズ、2'147'483'648バイト)。 これは、macosx snow leopardで何年も働いていました。FREADは読み取らない場合の長さ> 2G

私はそれをテストするためのプログラムを書いた:

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

だけで実行します。 OUTPUTFILE

  • のopenssl SHA INPUTFILE
  • のopenssl SHA OUTPUTFILE

    • ./pgm入力ファイルを

      エラーがありませんr。 2つのファイルの長さは同じです。 2つの指紋が同じではありません。 (ポインタは十分に割り当てられており、出力ファイルに書き込まれます) fwriteではなく、freadのみです。

      私はこの問題を理解していません。

      私はこのプログラムを見ています(リンゴでこのプログラムを使用するかどうかわかりません)。 変数はintとして定義されています。あなたは64ビットモードでコンパイルしていないように答え

  • +2

    OSX 32ビットまたは64ビットのですか? 32ビットであれば、2GB以上のデータを読み込むことはできませんし、メモリー内に大きなオブジェクトを作成することもできます。 –

    答えて

    1

    ため http://www.opensource.apple.com/source/Libc/Libc-186/stdio.subproj/fread.c

    おかげでね。コマンドライン引数、または使用しているコンパイラのオプションを探します。あなたが正しいモードでコンパイルしていることを確認するには、printf("%d\n", sizeof(int));と期待どおりに表示されているかどうかを確認してください。

    1

    XCodeの4.2とMacOS Xのライオン(10.7.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 
    $ 
    
    +0

    '/ dev/zero'はここでテストファイルを作成するのに悪い選択でした。非常に大きな 'malloc'呼び出しがカーネルからゼロページを引き出すので、' fread'が壊れていれば、ゼロのメモリ空間に対してゼロのファイルをテストします。 –

    0

    のprintf( "%d個の\ n"、はsizeof(INT))。 のgcc -Wall Typ.c -o標準 警告:フォーマット '%d' は 'INT' を入力し期待していますが、引数2 'は長いunsigned int型' 警告を入力しています。format '%dは' 'INT' と入力期待しますが、引数> 4

    あなたにジョナサンをありがとう - 2「は長い が入力しています。

    私は10.7.2とXcode 4.2

    のgcc --version のi686-りんごdarwin11-LLVM-GCC-4.2(GCC)4.2.1の午前(アップル社に基づいて5658をビルド)(LLVM は/ usr/binに/ gccの-g -std = c99を-Wall -Wextra 2gb.c -o:私はTestFile.o -o gccのTestFile.cを行い、さらには正確にあなたが行ったように2336.1.00)

    を構築2ギガバイト と私は

    後に-m64を追加し、私は再び2貴様の指紋を持っています。

    xcode 3.6.2は、sudo/Library/uninstall-devtools --mode = all とxcode 4.2 installを使用して削除されました。

    私は、新たに作成された別のユーザー(おそらく$ pathの原因)と同じものでpgmを実行します。

    わかりません。


    アップルのチームの答えこれは、これは既知の問題であると判断された更なる調査の後のBug ID#10376104.のフォローアップである

    こんにちはステファン、

    このバグを報告した後、現在エンジニアリングによって調査中です。この問題は、オリジナルのバグID#6434977のバグデータベースに保存されています。この重複した問題を追跡するために使用されていた元のバグ番号は、バグレポートの[問題の詳細]ビューの[関連する問題]セクションにあります。

    このバグレポートを送信いただきありがとうございます。バグの発見と隔離にご協力いただきありがとうございます。

    よろしく、

    開発バグレポートチーム アップルのワールドワイドデベロッパリレーションズ

    +0

    私は新しいパーティションを作成し、Lionをインストールし、Lionを更新し(10.7.2)、Xcodeをインストールします(4.2)。それと同じ問題が再び発生します。 (信じられないほど)...だから私はAppleにバグを送るでしょう。私のマシンはmacpro 6コア2010年9月です。 – Stephane

    +0

    Appleのチームの返答後、このバグを報告しました。上記のテキストを参照してください(556文字以上) – Stephane

    +0

    固定!はい、彼らはそれをやった!それはちょうど2年以上かかるが、この問題は今解決されている。(最後のマーベリックスで) – Stephane

    関連する問題