0

我有这些多个错误和警告,我几乎尝试了所有方法,但无法弄清楚。非常感谢您的帮助!这是我的代码:

#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:在函数“main”中:copyfile.c:44:3:警告:从不兼容的指针类型传递“fputc”的参数 2 [默认启用] 在 copyfile.c:1:0 中包含的文件中:/usr /include/stdio.h:573:12:注意:预期为“struct FILE *”,但参数的类型为“char *”</p>

非常感谢您的帮助!!

4

2 回答 2

1

在您的代码dst_file中是char [20]您使用的fopena,获取FILE *您存储的a dst_p

而不是fputc(c, dst_file)尝试fputc(c, dst_p)

于 2013-10-02T21:39:21.817 回答
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;
}
于 2013-10-03T06:20:38.740 回答