| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1193 人关注过本帖
标题:我写了一个“家庭收支管理系统”,程序读取文件有问题,我找不出出错在哪, ...
只看楼主 加入收藏
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
二楼的意思是你打fp=fopen("D:people.txt","w");怎么不按照read里的写法
if((fp=fopen("D:people.txt","r"))!=NULL);判断文件句柄是否打开了。

我们都在路上。。。。。
2011-12-31 15:04
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:20 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 10
struct people
{
    char name[20];
    int year;
    int month;
    int in;
    int out;
    
}peo[SIZE];

int n=0 ;//n表示输入的成员个数

void sort() //升序排序
{
    int i, j;
    struct people temp;
    for(i=1; i<n; i++)
    {
        temp = peo[i];
        j = i - 1;
        while(j>=0 && (strcmp(peo[j].name ,temp.name)>0 || strcmp(peo[j].name ,temp.name)==0  && (peo[j].year>temp.year || peo[j].year==temp.year && peo[j].month>temp.month)))
        {
            peo[j+1] = peo[j];
            j--;
        }
        peo[j+1] = temp;
    }
        
}

int save()
{
    sort();
    FILE *fp;
    int i;
    fp=fopen("D:\\people.txt","w"); //错误:要么不要路径直接写文件名(最后文件和代码源文件在一个目录中);要么改为"D:\\people.txt"(\转义字符)
    {
        fprintf(fp,"%d\n",n);
        for(i=0;i<n;i++)
        {
            fprintf(fp,"%-20s%4d.%-4d%9d%9d\n",peo[i].name,peo[i].year,peo[i].month,peo[i].in,peo[i].out);
        }
    }
    fclose(fp);
    return 0;
}


int read()
{
    FILE *fp;
    int i;
    if(!(fp=fopen("D:\\people.txt","r")))//同上
    {
        return -1;
    }
    else
    {
        fscanf(fp,"%d\n",&n);
        for(i=0;i<n;i++)
        {
            fscanf(fp,"%s%d.%d%d%d\n",peo[i].name,&peo[i].year,&peo[i].month,&peo[i].in,&peo[i].out);
            printf("%-20s%4d.%-4d%9d%9d\n",peo[i].name,peo[i].year,peo[i].month,peo[i].in, peo[i].out);
        }
    }
    fclose(fp);
    return 0;
    
}


int add_people()
{
    read();
    char name[20];
    char ch;
    printf("\n[录入新成员信息]\n");
    while(tolower(ch) != 'y')
    {
        printf("\n请输入姓名:");
        scanf("\n%s",name);
        strcpy(peo[n].name,name);
        printf("\n请输入年份:");
        scanf("%d",&peo[n].year);
        printf("\n请输入月份:");
        scanf("%d",&peo[n].month);
        printf("\n请输入收入:");
        scanf("%d",&peo[n].in);
        printf("\n请输入支出:");
        scanf("%d",&peo[n].out);
        n++;
        printf("\n是否结束输入(Y/N):\n");
        getchar(); //吃掉回车
        scanf("%c", &ch);
    }
    save();
    read();
    return 0;
}


int dele_people()
{
    char name[20];
    int postion[SIZE+1];
    postion[0] = 0; //postion[0]存储元素个数
    int i,j = 1 ,year, month, k1=n, flag=1;
    read();
    printf("\n请输入要删除成员姓名:\n");
    scanf("%s", name);
    for(i=0; i<n; i++)
    {
        if(strcmp(peo[i].name, name) == 0)
        {
            printf("该成员信息:\n");
            printf("%-20s%4d.%-4d%9d%9d\n",peo[i].name,peo[i].year,peo[i].month,peo[i].in, peo[i].out);
            postion[j++] = i; //记录符合条件成员记录在peo[]中位置
            postion[0]++;
            flag = 0;
        }        
    }
    if(i == n && flag == 1)
        printf("\r没有找到符合条件成员!\n");
    k1 = postion[1]; //第一个符合姓名条件的成员在peo[]中位置
    if(postion[0]>1) //符合姓名条件的成员大于1时,就要通过时间来确定删除那个
        {
            printf("请选择要删除该成员那个时间的记录(例如:1988.8):\n");
            scanf("%d.%d" ,&year, &month);
            for(int k=1; k<=postion[0]; k++)
            {
                k1 = postion[k];
                if(peo[k1].year == year && peo[k1].month == month)
                {
                    printf("符合条件的成员信息为:\n");
                    printf("%-20s%4d.%-4d%9d%9d\n",peo[k1].name,peo[k1].year,peo[k1].month,peo[k1].in, peo[k1].out);
                    break;
                }
                else
                {
                    printf("没有相应的成员符合条件!\n");
                }
            }
        }
    while(k1<n) //删除该成员特定时间某条记录
    {
        peo[k1] = peo[k1+1];
        k1++;
    }
    n--;
    printf("删除成功!\n");
    save();
    read();
    return 0;
}

int change_people()
{
    char name[20];
    int postion[SIZE+1];
    postion[0] = 0; //postion[0]存储元素个数
    int i,j = 1 ,year, month, k1, flag=1;
    read();
    printf("\n请输入要修改成员姓名:\n");
    scanf("%s" ,name);
    for(i=0; i<n; i++)
    {
        if(strcmp(peo[i].name, name) == 0)
        {
            printf("该成员信息:\n");
            printf("%-20s%4d.%-4d%9d%9d\n",name,peo[i].year,peo[i].month,peo[i].in, peo[i].out);
            postion[j++] = i; //记录符合条件成员记录在peo[]中位置
            postion[0]++;
            flag=0; //flag值改变表示存在符合条件的成员
        }        
    }
    if(i == n && flag == 1)
        printf("\r没有找到符合条件成员!\n");
    k1 = postion[1]; //第一个符合姓名条件的成员在peo[]中位置
    if(postion[0]>1) //符合姓名条件的成员大于1时,就要通过时间来确定删除那个
        {
            printf("请选择要删除该成员那个时间的记录(例如:1998.8):\n");
            scanf("%d.%d", &year, &month);
            for(int k=1; k<=postion[0]; k++)
            {
                k1 = postion[k];
                if(peo[k1].year == year && peo[k1].month == month)
                {
                    printf("符合条件的成员信息为:\n");
                    printf("%-20s%4d.%-4d%9d%9d\n",peo[k1].name,peo[k1].year,peo[k1].month,peo[k1].in, peo[k1].out);
                    break;
                }
                else
                {
                    printf("没有相应的成员符合条件!\n");
                }
            }
        }
    //修改信息
    printf("\n请输入修改后数据:\n");
    printf("\n年份:");
    scanf("%d",&peo[k1].year);
    printf("\n月份:");
    scanf("%d",&peo[k1].month);
    printf("\n收入:");
    scanf("%d",&peo[k1].in);
    printf("\n支出:");
    scanf("%d",&peo[k1].out);
    save();
    read();
    return 0;
}


int search_people()
{
    char name[20];
    int i;
    read();
    printf("\n请输入要查找成员姓名:\n");
    scanf("%s", name);
    printf("\n%s的所有收支信息:\n\n",name);
    printf("姓名     时间     收入     支出      总计\n");
    for(i=0; i<n; i++)
    {
        if(strcmp(peo[i].name, name) == 0)
        {
            printf("%-20s%4d.%-4d%9d%9d%9d\n",peo[i].name,peo[i].year,peo[i].month,peo[i].in,peo[i].out,peo[i].in-peo[i].out);
        }        
    }
    return 0;
}


int go()
{
    printf("\n\n《谢谢使用家庭管理系统》\n\n");
    printf("\n\n        潘黄岷\n\n");
    exit(0);
    return 0;
}





void printmenu()
{
    printf("\n                 选择菜单\n");
    printf("````````````````````````````````````````````````\n\n");
    printf("1.添加成员收支信息\n");
    printf("2.删除成员收支信息\n");
    printf("3.修改成员收支信息\n");
    printf("4.查询成员收支信息\n");
    printf("5.退出界面\n\n");
    printf("````````````````````````````````````````````````\n\n");
} 


void main()
{
    int choise;
    while(1)
    {
        printf("\n");
        printmenu();
        printf("请输入你的选择\n");
        scanf("%d", &choise);
        switch(choise)
        {
        case 1:
            printf("添加操作状态!\n");
            add_people();
            break;
            
        case 2:
            printf("删除操作状态!\n");
            dele_people();
            break;
            
        case 3:
            printf("修改操作状态!\n");
            change_people();
            break;
            
        case 4:
            printf("查询操作状态!\n");
            search_people();
            break;
            
            
        case 5:   
            printf("退出\n");
            go();
            break;
            
        default:
            printf("输入错误!\n");
        }
    }
}


[ 本帖最后由 liao06550107 于 2012-1-1 11:05 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2011-12-31 18:55
快速回复:我写了一个“家庭收支管理系统”,程序读取文件有问题,我找不出出错在 ...
数据加载中...
 
   



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

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