Призывы к системе с файлами

У меня есть код, миссия которого состоит в том, чтобы копировать шрифт в судьбе. Вопрос состоит, в том, что, составив, он предупреждает меня о том, что в линии 38 реализует ассигнование от целого числа до указателя без одного, я леплю и не знаю, как упорядочивать это.

Кроме того, выполнив это в linux, он дает мне Нарушение сегмента 'core' произведено. Также, в CodeBlocks рождается преждевременно выполнение.

Это мой код:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>

int copia (char * ruta_fue, char * ruta_des){
    int fd_fue,fd_des,leidos,escritos;
    void * dato;
    if(access(ruta_des,F_OK)==0){
        fd_fue = open(ruta_des,O_WRONLY|O_TRUNC);
    } else {
        fd_fue = creat(ruta_des,0600);
    }
    fd_fue = open(ruta_fue,O_RDONLY);
    if(fd_fue<0){
        fprintf(stderr, "Ha fallado la apertura de %s\n", ruta_fue);
        perror("");
        return -1;
    }
    while( ( leidos = read(fd_fue,&dato,sizeof(int) ) ) > 0 ){
        if( ( escritos = write(fd_des,dato,leidos) ) < 0 ){
            fprintf(stderr, "Ha fallado la escritura de %s\n", ruta_des);
            perror("");
            return -1;
        }
    }
    close(fd_fue);
    close(fd_des);
    printf("La copia se ha realizado bien");
    return 1;
}

int main(int argc, char * argv[]){
    char * ruta_fue,ruta_des;
    ruta_fue = (char *)argv[1];
    ruta_des = (char *)argv[2];
    copia(ruta_fue,ruta_des);

    struct stat info_fue, info_des;
    stat(ruta_fue,&info_fue);
    stat(ruta_des,&info_des);
    if(info_fue.st_size!=info_des.st_size){
        fprintf(stderr,"Los tamaños de %s y %s no coinciden",ruta_fue,ruta_des);
        return -1;
    }
    printf("Los tamaños de %s y %s son iguales",ruta_fue,ruta_des);
}

Заметь: линия 38 ruta_des = (char *)argv[2];.

2
задан 22.03.2016, 06:13
2 ответа

Из-за общей нормы попробуй составлять с flags -Wall -Wextra -Wpedantic, и потом попробуй упорядочивать, ошибки один из-за одного начиная с первого, который выходит.

Например, твоего приложения (это ты был бы должен присоединить это в вопросе):

 In function 'int main(int, char**)':
38:14: error: invalid conversion from 'char*' to 'char' [-fpermissive]
39:28: error: invalid conversion from 'char' to 'char*' [-fpermissive]
43:28: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
45:80: warning: format '%s' expects argument of type 'char*', but argument 4 has type 'int' [-Wformat=]
48:67: warning: format '%s' expects argument of type 'char*', but argument 3 has type 'int' [-Wformat=]
 At global scope:
35:14: warning: unused parameter 'argc' [-Wunused-parameter]

Мы видим, что ты пробуешь распределить char одному char*. Это происходит, потому что у тебя есть заявление переменных неправильной формы:

char * ruta_fue,ruta_des;
  • ruta_fue это char*
  • ruta_des это char!!!

Измени это из-за:

char *ruta_fue, *ruta_des;

Другая проблема, которая у тебя есть, состоит в том, что ты не подтверждаешь, если число параметров, которое получает программу argc совпади с тем, что ты ждешь: (3 или больше), так как доступы argc[1] и argc[2] они могут не быть действительными. Защити этот район подтверждая, argc - то, ли что ты ждешь и sinó закончи программу:

if (argc < 3) return -1;

Другая ошибка, которая у тебя есть:

23:50: warning: 'fd_des' may be used uninitialized in this function [-Wmaybe-uninitialized]

Ты был бы должен инициализировать этот file описывающий перед тем, как звонить в write

3
ответ дан 24.11.2019, 14:42
  • 1
    if (argc < 3) return -1; est и # 225; хорошо, но перед тем, как возвращать лучше печатать сообщение, если не, мы остаемся натощак:-) – leonbloy 21.03.2016, 20:27

Проблема состоит в том, что declaraciГіn

char * ruta_fue,ruta_des;

- эквивалентный

char * ruta_fue;
char ruta_des;

, того, что ты хочешь, взамен,

char * ruta_fue;
char * ruta_des;

или, если ты хочешь поместить это в одну lГ-nea:

char *ruta_fue, *ruta_des;

В ней declaraciГіn char * x; представляет, что звездочка прикреплена к переменной, не в тип: он читается как char (* x), который в свою очередь читается, как" x указывает на один char " - или" x dereferenciado - типа char"). Следовательно char * x, z ; значит" x указывает на один char и z один char "

( Деталей - в inglГ©s).

2
ответ дан 24.11.2019, 14:42