鱼C论坛

 找回密码
 立即注册
查看: 2850|回复: 3

连接两个文件的程序,编译过了,执行不了啊!

[复制链接]
发表于 2012-7-7 21:27:22 | 显示全部楼层 |阅读模式
20鱼币
#include<stdio.h>
#include<conio.h>
int asd(char *b,FILE *c,char *d);
void main()
{

FILE *aimfile;
FILE *coverfile;
char name[100],name_2[100],*rb="rb",*ab="ab";
char *str;
long len=0;
printf("请输入需隐藏的文件\n");//如x:\\123.txt
len=asd(name,aimfile,rb);
printf("请输入用于隐藏的文件,\n");//如y:\\123.bmp
asd(name_2,coverfile,ab);
fread(str,1,len+1,aimfile);
fwrite(str,1,len+1,coverfile);
fclose(aimfile);
fclose(coverfile);
remove(name);
}
int asd(char *b,FILE *c,char *d)
{
int a=0,e=0;
for(;a==0;)
{   
  gets(b);
  if((c=fopen(b,d))==NULL)
  {  
   printf("error!please try again\n");  
   getch();
   a=0;
  }
  else
  {
   printf("ok\n");
   a=1;
   fseek(c,0L,SEEK_END);
   e=ftell(c);
  }
}
return e;
}
到底错哪了?

最佳答案

查看完整内容

#include //这里我啦进来的时候没有空格 FILE * asd(char *b,FILE* c,char *d); void main() { FILE *aimfile; FILE *coverfile; char name[100],name_2[100],*rb="ab+",*ab="ab+";//这里你之前是rb,这样不能直接打开不存在的文件, char str[200] = "Hello world";//你之前是*str,这个指针指向一个不可知的地方,你没有初始化,你可以把一个字符数组的首地址给他。但是不初始化就用的话肯定就会出现内存读写错误 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-7 21:27:23 | 显示全部楼层
#include <conio.h>  //这里我啦进来的时候没有空格
FILE * asd(char *b,FILE* c,char *d);
void main()
{

        FILE *aimfile;
        FILE *coverfile;

        char name[100],name_2[100],*rb="ab+",*ab="ab+";//这里你之前是rb,这样不能直接打开不存在的文件,
        char str[200] = "Hello world";//你之前是*str,这个指针指向一个不可知的地方,你没有初始化,你可以把一个字符数组的首地址给他。但是不初始化就用的话肯定就会出现内存读写错误,因为里面的默认值是0xcccccccc
        long len=0;
        printf("请输入需隐藏的文件\n");//如x:\\123.txt
        aimfile = asd(name,aimfile,rb);//这里我调试了,你返回的文件指针的位置,为0,也就是说len == 0;
        printf("请输入用于隐藏的文件,\n");//如y:\\123.bmp
        coverfile = asd(name_2,coverfile,ab);
        len = ftell(aimfile);   //这里按你的思想获取长度
        fread(str,1,len+1,aimfile); //真正的错误都是在这里,str我前面给你改了。
        //但是这里你的文件存在严重错误,因为你的文件没有打开,为什么呢?因为你的文件指针是主函数的局部变量
        //而你是在另外一个函数里面打开的,你打开了却没有返回文件类型指针,所以你只是把另外一个函数里面的文件
        //打开了。这里两个文件指针同样的。。。所以你的代码 我大改一下,具体思想是把文件指针放到全局
        fwrite(str,1,len+1,coverfile);
        fclose(aimfile);
        fclose(coverfile);
        remove(name);
}
FILE* asd(char *b,FILE *c,char *d)
{
        int a=0,e=0;
        for(;a==0;)
        {   
                gets(b);
                if((c=fopen(b,d))==NULL)
                {  
                        printf("error!please try again\n");  
                        getch();
                        a=0;
                }
                else
                {
                        printf("ok\n");
                        a=1;
                        fseek(c,0L,SEEK_END);
        //                e=ftell(c);   //按你的思想若是要指针的位置的话,在主函数可以获取,不用在这里
                }
        }
        return c;  //这里返回文件指针。。
}
你的代码我改好了,具体改了哪里都有注释,还有修改的原因,目前没有执行错误,具体你要实现什么功能,你自己再添加,再修改。。。你fread文件的时候 文件里面没有内容,不晓得你要实现什么功能反正,对于文件操作应该注意的问题我注释 说的很清楚  你想要什么功能添加的时候 注意就好了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-7-8 12:03:41 | 显示全部楼层
哦  注释的地方写错了一点,我先把你的文件指针放到全局,发现不行,最后就用了另一种方法,让你的函数返回文件指针,你的核心错误就是这里,你之前那样就像  你在主函数里面定义了一个变量,然后作为参数传递给另一个函数,在另一个函数里面赋值了。
int fan(int a);
void main()
{int v; fun(v);}
int fun(int a)
{a = 9; return 0;}    这样,你之前就像这样,执行完以后主函数里面的v的值还是没有变。
所以要写成 v = fun(v);fun函数里面写成 return a;  这样就好了。。。        
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-7-8 12:16:12 | 显示全部楼层
太感谢了,虽然昨天我也想过自定义函数打开的文件不能在主函数里用,可改过后还是不行,现在来看,是str没有初始化,地址和文件指针重复了,昨天头都想炸了,谢谢啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-14 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表