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]に使用する があり、に保存する をfopen取得します。FILE *dst_p

fputc(c, dst_file)試してみる代わりにfputc(c, dst_p)

于 2013-10-02T21:39:21.817 に答える
0

ファイル名を fgets するとき、(オペレーティング システムに応じて) ラインフィード、キャリッジ リターン、またはその両方を含む入力行を読み取っていることを認識する必要があります。したがって、これらの無関係な文字を削除する便利な方法が必要です。

perl などからアイデアを借りて、行末から '\n' と '\r' を削除する chomp() が好きです。

また、ファイル ハンドルとファイル ハンドル、ファイル ハンドルではなくファイル名の fputc にも注意する必要があります。

また、char[20] はファイル名としてはかなり小さいので、200 以上にしてみてください。また、「w+」は出力ファイルが存在しないときに作成することに気付くかもしれません。ハードコードされたサイズではなく、fgets サイズに sizeof(variable) を使用します。

これは機能し、

#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 に答える