ошибка сегментации при копировании файла - PullRequest
1 голос
/ 22 января 2012

Я новичок и пытаюсь скопировать содержимое очень большого текстового файла размером около 33 МБ (точно 33136 КБ) в новый файл.Я получаю ошибку сегментации при запуске программы.Только 16 КБ копируется в мой новый файл.Имя файла, который я копирую, - «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]# 

Пожалуйста, скажите мне, что я, возможно, делаю неправильно.Есть ли лучший метод?Пожалуйста, помогите мне

1 Ответ

2 голосов
/ 22 января 2012

Не использовать fprintf; второй аргумент он обрабатывает как строку формата. Используйте fwrite.

Что касается , почему вызывает ошибки, подумайте, что произойдет, если ваши входные данные содержат, например ,. %s. fprintf затем начнет проходить по стеку, читая случайные данные, пока не найдет 0-значный байт (нулевой терминатор). Это может легко привести к тому, что вы попадете в память, которая не принадлежит приложению.

...