免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1880 | 回复: 5
打印 上一主题 下一主题

[C] 向大家请教一个C语言文件编程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-09 22:30 |只看该作者 |倒序浏览
最近我在练习C语言编程关于文件操作的问题,是这样的,我的程序里面要多次用到打开文件的操作:
if((fp=fopen(filename,style))==NULL){
                printf("Warning!!Cannot open this file\n");
                exit(0);
        }
我觉得重复得太多了不好,我就单独把它写成了个子程序,但这样一来,原本正确的程序不返回任何结果,自己就结束,还居然回到命令提示符下!我想了很久没找到问题的根源,是文件不能这样打开吗?请高手以及众兄弟指点迷津,给个意见,谢谢!
附源代码:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main(){
        void initiate();
        void sort(char *);
        void combine(char *);
        void display();
        void file_open(char *,char *,FILE *);
        char *string;
        int i;
        FILE *fp;
        file_open("C","wb",fp);
        clrscr();
        printf("Initiating file 'A' and file 'B'...\n");
        initiate();
        combine(string);
        sort(string);
        for(i=0;i<10;i++)
                fwrite(string+i,sizeof(char),1,fp);
        fclose(fp);
        display();
}
void file_open(char *filename,char *style,FILE *fp){    //这就是我写的子程序
        if((fp=fopen(filename,style))==NULL){
                printf("Warning!!Cannot open this file\n");
                exit(0);
        }}

void initiate(){
        FILE *fp1,*fp2;
        file_open("A","wb",fp1);
        file_open("B","wb",fp2);
        fputs("fedcba",fp1);
        fputs("jihg",fp2);
        fclose(fp1);
        fclose(fp2);
}
void sort(char *str){
        int i,j,temp;
        for(i=0;i<9;i++)
                for(j=0;j<9-i;j++){
                        if(str[j]>str[j+1]){
                                temp=str[j];
                                str[j]=str[j+1];
                                str[j+1]=temp;
                        }
                }
}
void combine(char *str){
        FILE *fp1,*fp2;
        int i;
        file_open("A","rb",fp1);
        file_open("B","rb",fp2);
        for(i=0;i<6,!feof(fp1);i++) *(str+i)=fgetc(fp1);
        for(i=6;i<10,!feof(fp2);i++) *(str+i)=fgetc(fp2);
        fclose(fp1);
        fclose(fp2);
}
void display(){
        FILE *fp;
        char ch;
        file_open("C","rb",fp);
        printf("The selected characters are:\n");
        ch=fgetc(fp);
        while(ch!=EOF){
                putchar(ch);
                ch=fgetc(fp);
        }
        fclose(fp);
}

[ 本帖最后由 pascal7718 于 2007-7-9 22:33 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-07-09 22:42 |只看该作者
函数是传值调用, 你传给函数的是一个指针变量, 在调用的函数中这个指针变量变化了, 但是并没有传回到调用它的函数中.
对于这个问题在林锐的<高质量程序设计>中内存管理那章有具体说明.
此时你应该使用指针的指针的方式来传递参数. 才能够返回回来.

论坛徽章:
0
3 [报告]
发表于 2007-07-09 22:45 |只看该作者

  1. void file_open(char *filename,char *style,FILE **fp){    //这就是我写的子程序
  2.         if((*fp=fopen(filename,style))==NULL){
  3.                 printf("Warning!!Cannot open this file\n");
  4.                 exit(0);
  5.         }}

复制代码

调用的时候使用        file_open("C","wb",&fp);

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2007-07-10 11:41 |只看该作者
原帖由 pascal7718 于 2007-7-9 22:30 发表
最近我在练习C语言编程关于文件操作的问题,是这样的,我的程序里面要多次用到打开文件的操作:
if((fp=fopen(filename,style))==NULL){
                printf("Warning!!Cannot open this file\n");
                exit(0);
        }
我 ...

又一个栽在"C 的函数调用是传值"上的伙计……

论坛徽章:
0
5 [报告]
发表于 2007-07-10 13:23 |只看该作者

string都没初始化就用了?你可以在file_open()加个return语句

FILE *file_open(char *filename,char *style,FILE *fp){    /*这就是我写的子程序*/
        if((fp=fopen(filename,style))==NULL)
        {
                printf("Warning!!Cannot open this file\n";
                exit(0);
        }
                return fp;
        //getch();
}
然后在其他函数中相应的修改:wink:

论坛徽章:
0
6 [报告]
发表于 2007-07-10 14:36 |只看该作者
注意 “=”和“==”的优先级

sorry, 看错了,应该传入 FILE **fpp

[ 本帖最后由 JohnBull 于 2007-7-10 14:37 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP