| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
Reworld,下班在家制作游戏,1500万奖金等你拿以码会友 以友辅仁
共有 709 人关注过本帖
标题:新写了个复制粘贴的程序,还请大家看看还有没有什么不足
只看楼主 加入收藏
aCprogrammer
Rank: 2
等 级:论坛游民
威 望:3
帖 子:38
专家分:43
注 册:2019-6-25
结帖率:100%
  已结贴   问题点数:10  回复次数:23   
新写了个复制粘贴的程序,还请大家看看还有没有什么不足
#include<stdio.h>
#include<stdlib.h>
void string(char pp[]);//给被复制的文件的文件名进行去双引号的函数 1
void string_1(char vv[]);// 给被复制的文件的文件名进行去双引号的函数 2
char io[100],uu[100];//定义全局变量,保证数据离开被调函数后不会被销毁,用来存放经函数去掉引号后的字符串
int mm=0;



int main()
{
    FILE *fp,*f,*oj;
    char a[100],b[100],ch,aj[100];
   
   
    puts("PS1: the function of this program is to copy one\nspecified file into another specified fileand\nthen destroy the contents of the copied file!");
    puts("\n\n");
    printf("PS2: You can drag files directly in.\n");
    puts("\n\n");
    puts("PS3: You can only copy and paste documents of the same kind!");
    putchar('\n');
    putchar('\n');
    puts("Please enter a file name to copy:");
    gets(b);//输入原始的被复制文件的文件名
    string(b);//调用函数去掉被复制文件的文件名中可能出现的双引号
    putchar('\n');
    puts("Please enter the file name to be pasted:");
    gets(a);//输入原始的要粘贴文件的文件名
    string_1(a);//调用函数去掉要粘贴文件的文件名中可能出现的双引号
    putchar('\n');
    fp=fopen(uu,"ab+");//使用去掉双引号后的文件名打开要粘贴的文件
    if(!fp)
    {
        printf("Can not open the file %s",uu);
        system("pause");
        return 0;
    }
    f=fopen(io,"rb");//使用去掉双引号后的文件名打开被复制的文件
    if(!f)
    {
        printf("Can not open the file %s",io);
        system("pause");
        return 0;
    }
    while(!(feof(f)))
    {
        ch=fgetc(f);
        fputc(ch,fp);
    }
    fclose(fp);//关闭要粘贴的文件
    fclose(f);//关闭被复制的文件
    oj=fopen(io,"wb");//重新打开被复制的文件,并且把其中的数据删除
    if(!oj)
    {
        printf("Can not destroy files %s",b);
        return 0;
    }
    fclose(oj);
    puts("Done!\n");
    system("pause");
    return 0;
}



void string(char pp[])//去文件名中双引号的函数定义1
{
    int rr=0;
    while(pp[rr]!='\0')
    {
        if(pp[rr]!='"')
        {
            io[mm]=pp[rr];
            mm++;
        }
        rr++;
    }
}




void string_1(char vv[])//去文件名中双引号的函数定义2
{
    int o=0;
    int y=0;
    while(vv[o]!='\0')
    {
        if(vv[o]!='"')
        {
            uu[y]=vv[o];
            y++;
        }
        o++;
    }
}
搜索更多相关主题的帖子: 复制 文件 文件名 双引号 函数 
2019-07-04 17:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:322
帖 子:6637
专家分:38486
注 册:2011-1-18
  得分:0 
看到 while(!(feof(f))) 十有八九是错的
2019-07-04 19:14
aCprogrammer
Rank: 2
等 级:论坛游民
威 望:3
帖 子:38
专家分:43
注 册:2019-6-25
  得分:0 
回复 2楼 rjsp
有什么问题吗,编译的时候没给报错啊
2019-07-04 20:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:322
帖 子:6637
专家分:38486
注 册:2011-1-18
  得分:0 
以下是引用aCprogrammer在2019-7-4 20:07:18的发言:

有什么问题吗,编译的时候没给报错啊

错误太多,我帮你重写吧
程序代码:
#include <stdio.h>

FILE* open_file( const char* filemode )
{
    char filename[260]; // windows定义_MAX_PATH为260,linux定义PATH_MAX为4096,但都可以更大
    if( !fgets(filename,sizeof(filename)/sizeof(*filename),stdin) ) // 读入一行
    {
        puts( "输入失败." );
        return NULL;
    }

    // 去除双引号
    {
        char* q=filename;
        for( char* p=filename; *p; ++p )
            if( *p != '"' )
                *q++ = *p;
        if( q==filename || q[-1]!='\n' ) // filename空间容量不足
        {
            puts( "文件名过长." );
            return NULL;
        }
        q[-1] = '\0';
    }

    FILE* file = fopen( filename, filemode );
    if( !file )
        printf( "文件\"%s\"打开失败.\n", filename );
    return file;
}

int main( void )
{
    puts( "Please enter a file name to copy:" );
    FILE* src = open_file( "rb" ); // f
    if( !src )
        return 1;

    puts( "Please enter the file name to be pasted:" );
    FILE* dst = open_file( "ab+" ); // fp
    if( !dst )
    {
        fclose( src );
        return 2;
    }

    // 从你错误的 while(!(feof(f))) 改写而来。当然,一个一个字符的拷贝,运行效率就不谈了
    for( int ch; ch=fgetc(src), ch!=EOF; )
    {
        if( fputc(ch,dst) == EOF )
        {
            puts( "拷贝文件内容时错误." );
            fclose( dst );
            fclose( src );
            return 3;
        }
    }
    puts( "拷贝完毕." );

    fclose( dst );
    fclose( src );
    return 0;
}

2019-07-05 09:43
aCprogrammer
Rank: 2
等 级:论坛游民
威 望:3
帖 子:38
专家分:43
注 册:2019-6-25
  得分:0 
回复 4楼 rjsp
为什么要用ch!=EOF,不是以二进制的格式打开的吗,feof函数不是检查是否到文件末尾的函数么,而且照你这样的话就不能删除被复制的文件了

[此贴子已经被作者于2019-7-5 14:05编辑过]

2019-07-05 14:02
aCprogrammer
Rank: 2
等 级:论坛游民
威 望:3
帖 子:38
专家分:43
注 册:2019-6-25
  得分:0 
你这个方法C99不支持
2019-07-05 14:09
aCprogrammer
Rank: 2
等 级:论坛游民
威 望:3
帖 子:38
专家分:43
注 册:2019-6-25
  得分:0 
附件: 您没有浏览附件的权限,请 登录注册
2019-07-05 14:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:322
帖 子:6637
专家分:38486
注 册:2011-1-18
  得分:0 
为什么要用ch!=EOF,
C标准只规定了以返回值判断正误这种唯一的方式
不是以二进制的格式打开的吗,
什么?且,不管是什么,又和是不是“以二进制的格式打开”有什么关系?
feof函数不是检查是否到文件末尾的函数么,
不是
而且照你这样的话就不能删除被复制的文件了
“照你这样的话”是什么样的话?不明白你在说什么,我干什么了,导致你不能删除被复制的文件?
C标准函数中没有删除文件的函数,非标的有 remove 等。
2019-07-05 14:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:322
帖 子:6637
专家分:38486
注 册:2011-1-18
  得分:0 
以下是引用aCprogrammer在2019-7-5 14:09:08的发言:

你这个方法C99不支持
是 C99不支持,还是 C99之前不支持?
证据在你自己贴的7楼上。图片上写着 'for' loop initial declaration used outside c99 mode

保险起见,我将编译参数从现世的“-std=c18”改为上世纪古老的“-std=c99”,重新编译,无警告无错误。
2019-07-05 14:30
aCprogrammer
Rank: 2
等 级:论坛游民
威 望:3
帖 子:38
专家分:43
注 册:2019-6-25
  得分:0 
回复 9楼 rjsp
我只是搞不懂EOF不是判断文本文件的结尾吗,可我要的不是文本文件的复制粘贴啊
2019-07-05 14:33
快速回复:新写了个复制粘贴的程序,还请大家看看还有没有什么不足
数据加载中...
 
   





关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.062224 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved