2013-10-02 4 views
0

У меня эти множественные ошибки и предупреждения, и я пробовал практически все и не могу понять это. Ваша помощь очень ценится! Это мой код:Скопируйте один файл в другую ошибку в c

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

int main() 
{ 
    /* Create Usable Variables */ 
    FILE *src_p, *dst_p; 
    char src_file[20], dst_file[20]; 
    char c; 

    /* Retrieve Source File Name From User */ 
    printf("Enter Source File Name:\n"); 
    fgets(src_file, 19, stdin); 

    /* Attempt Opening Source File For Reading */ 
    if((src_p = fopen(src_file, "r")) == NULL) 
    { 
     printf("ERROR: Source File Failed To Open...\n"); 
     return(-1); 
    } 

    /* Retrieve Destination File Name From User */ 
    printf("Enter Destination File Name:\n"); 
    fgets(dst_file, 19, stdin); 

    /* Attempt Opening Destination File For Writing */ 
    if((dst_p = fopen(dst_file, "w")) == NULL) 
    { 
     fclose(src_p); 
     printf("ERROR: Destination File Failed To Open...\n"); 
     return(-2); 
    } 

    /* Copy Source File Contents Into Destination File */ 
    while((c = fgetc(src_p)) != EOF) 
     fputc(c, dst_file); 

    /* Close Files On Success */ 
    fclose(src_p); 
    fclose(dst_p); 

    return 0; 
} 

и ошибка, когда я пытаюсь скомпилировать это так:

copyfile.c: В функции 'главный': copyfile.c: 44: 3: предупреждение : передать аргумент 2 из 'fputc' из несовместимого типа указателя [включен по умолчанию] В файл, включенный из файла copyfile.c: 1: 0: /usr/include/stdio.h:573:12: note: expected 'struct FILE * ', но аргумент имеет тип' char * '

Ваша помощь очень признательна ред !!

ответ

0

Вам необходимо понять, что когда вы меняете имя файла, вы читаете строку ввода, которая включает (в зависимости от операционной системы) строку перевода, возврат каретки или и то, и другое. Поэтому вам нужен удобный способ удаления этих посторонних символов.

Заимствование идеи от perl, и др. Мне нравится chomp(), который удаляет «\ n» и «\ r» из конца строки.

Вам также нужно быть осторожным с вашими именами файлов и файлами, fputc в имени файла, а не с дескриптором файла.

И char [20] довольно мал для имени файла, попробуйте 200+; и вы можете обнаружить, что «w +» создаст выходной файл, если он не существует; и используйте sizeof (variable) для размера fgets, а не для жестко заданных размеров.

Это работает,

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
char* chomp(char* p) 
{ 
    int len; 
    if(!p) return(p); 
    if((len=strlen(p))<=0) return(p); 
    if(p[len-1] == '\n') { p[--len] = '\0'; } 
    if(p[len-1] == '\r') { p[--len] = '\0'; } 
    return(p); 
} 
int main() 
{ 
    /* Create Usable Variables */ 
    FILE *src_fh, *dst_fh; 
    char src_fn[256+1], dst_fn[256+1]; 

    /* Retrieve Source File Name From User */ 
    printf("Enter Source File Name:\n"); 
    fgets(src_fn, sizeof(src_fn), stdin); chomp(src_fn); 

    /* Attempt Opening Source File For Reading */ 
    if((src_fh = fopen(src_fn, "r")) == NULL) 
    { 
     printf("ERROR: Source File %s Failed To Open...\n",src_fn); 
     return(-1); 
    } 

    /* Retrieve Destination File Name From User */ 
    printf("Enter Destination File Name:\n"); 
    fgets(dst_fn, sizeof(dst_fn), stdin); chomp(dst_fn); 

    /* Attempt Opening Destination File For Writing */ 
    if((dst_fh = fopen(dst_fn, "w+")) == NULL) 
    { 
     fclose(src_fh); 
     printf("ERROR: Destination File %s Failed To Open...\n",dst_fn); 
     return(-2); 
    } 

    int ch; 
    /* Copy Source File Contents Into Destination File */ 
    while((ch = fgetc(src_fh)) != EOF) 
    { 
     fputc(ch, dst_fh); 
    } 

    /* Close Files On Success */ 
    fclose(src_fh); 
    fclose(dst_fh); 
    return 0; 
} 
1

В коде dst_file это char [20], который вы используете для fopen, получения FILE *, который вы храните в dst_p.

Вместо fputc(c, dst_file) попробуйте fputc(c, dst_p).

+0

LOL! Человек ... такая простая ошибка, такая большая головная боль. Спасибо. Я отвечу на ваш ответ через 3 минуты. –

+2

В дальнейшем эти простые ошибки могут быть легко устранены ** тщательно ** ошибками чтения, сообщаемыми вашим компилятором. Попытайтесь прочитать сообщение об ошибке gcc снова и посмотреть, понимаете ли вы его с информацией, которую @cnicutar дал вам. Вы узнаете многое из этого – Pankrates

+0

Да, вы правы, спасибо. Есть ли лучший отладчик для C (без использования IDE, конечно)? –

 Смежные вопросы

  • Нет связанных вопросов^_^