1

私は初心者で、サイズが約 33MB (正確には 33136KB) の非常に大きなテキスト ファイルの内容を新しいファイルにコピーしようとしています。プログラムの実行中にセグメンテーション違反が発生します。新しいファイルにコピーされるのは 16KB だけです。コピーするファイルの名前は「test_file3」で、新しいファイルの名前は「newfile」です。仮想ボックスのCentOS-5でこれらすべてを行っています。詳細は次のとおりです。

[root@localhost decomp_trials]# cat read_file.c

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

    int main( int argc, char *argv [] )
    {
            FILE *ifp, *ofp;
            char *ptr;

            ifp = fopen ( argv [ 1 ], "r" );
            ofp = fopen ( argv [ 2 ], "a" );

            for (  ptr = malloc ( 10 ); fread ( ptr, 1, 10, ifp ); )
                    fprintf ( ofp, ptr );

            fclose ( ifp );
            fclose ( ofp );

            return 0;
    }

[root@localhost decomp_trials]# cc read_file.c -o read_file
[root@localhost decomp_trials]# ./read_file /root/sys_cl_huk_ajh/imp/copy_hook7/test_file3 newfile
Segmentation fault
[root@localhost decomp_trials]# du -s newfile 
16      newfile
[root@localhost decomp_trials]# pwd
/root/sys_cl_huk_ajh/pro_jnk/decomp_trials
[root@localhost decomp_trials]# du -s ../../imp/copy_hook7/test_file3
33136   ../../imp/copy_hook7/test_file3
[root@localhost decomp_trials]# 

私が間違っている可能性があることを教えてください。より良い方法はありますか?私を助けてください

4

1 に答える 1

2

使用しないでくださいfprintf。2 番目の引数をフォーマット文字列として扱います。を使用しfwriteます。

seg-faults の理由については、入力データにたとえば%s. fprintf次に、スタックのウォークスルーを開始し、値が 0 のバイト (ヌル ターミネータ) が見つかるまでランダム データを読み取ります。これにより、アプリケーションが所有していないメモリに簡単に到達する可能性があります。

于 2012-01-22T13:03:03.407 に答える