| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6988 人关注过本帖
标题:新人上路,不懂就问。。大神求教!!
取消只看楼主 加入收藏
唯光阿九
Rank: 2
等 级:论坛游民
帖 子:21
专家分:59
注 册:2016-6-10
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:5 
新人上路,不懂就问。。大神求教!!
学校一个作业。。想了一段时间了,网上找不到类似的,看书,书上有些地方也不是很懂。。所以还是努力自己写了一个C。写得可能有点蠢,希望各路大神不吝赐教。。
程序代码:
/*
    编写一程序P337.C实现以下功能
  有一存储很多学生成绩的文本文件(学生与课程数不限),每个学生的数据包括学号(10个数字)、姓名(最多4个汉字)、性别、
    课程名称(最多7个汉字)、成绩(整数)。从键盘输入某个学生的姓名,要求在文件中查找有无其成绩记录(可能有多条记录或没有),
    然后在屏幕上显示出相应的信息。
  单击此处下载程序运行时测试用的学生成绩文件xscj.txt并保存到程序P337.C所在的文件夹且文件名保持不变。
    编程可用素材:printf("请输入要查找成绩的学生姓名:")、printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!")、
    printf("\n查找结果为:\n")、printf("文件中没有找到姓名为“…”的学生\n"…。
  程序的运行效果应严格地如图1、图2、图3所示,图中的红色部分是从键盘输入的内容。
*/
#include <stdio.h>
#include <string.h>

typedef struct xuesheng
{
    int xuehao[3];
    char mingzi[20];
    char xingbie[5];
    char kemu[30];
    int chengji;
}DENGJI;            /*结构体定义*/

int main(void)
{
    FILE *fp;
    DENGJI chazhao[30];    
    char shuru[10];                /*输入存入该字符串变量*/
    int i, flag = 0, count = 0;   /*定义标记和序号计数并赋值为0*/

    fp = fopen("xscj.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
        return 0;
    }                           /*判断文件是否正常打开*/
    printf("请输入要查找成绩的学生姓名:");
    gets(shuru);                /*输入名字*/
    while (!feof(fp))
    {
        i = 0;
        fscanf(fp, "%s, %s, %s, %s, %d",
               chazhao[i].xuehao, chazhao[i].mingzi, chazhao[i].xingbie, chazhao[i].kemu, &chazhao[i].chengji);
        i++;    
    }                            /*将文件内容读入结构体数组*/
    while (!feof(fp))
    { 
        i = 0;
        if (strcmp(chazhao[i].mingzi, shuru) == 0)
        {
            flag = 1;
            break;
        }                    /*判断是否有结构体元素成员与输入名字相等,并将标记赋值退出循环*/
        else
        {
            flag = 0;
        }                      
        i++;
    }
    if (flag == 0)
    {
        printf("文件中没有找到姓名为“%s”的学生\n", shuru);
        return 0;
    }                            /*标记为0说明上一次循环查找没有所寻值*/
    if (flag == 1)
    {
        printf("\n查找结果为:\n");
        while (!feof(fp))
        {
            i = 0;
            if (strcmp(chazhao[i].mingzi, shuru) == 0)
            {
                count++;              /*判断成功,序号赋值*/
                printf("%d, %s, %s, %s, %s, %d\n",count, chazhao[i].xuehao, chazhao[i].mingzi, chazhao[i].xingbie, chazhao[i].kemu, chazhao[i].chengji);                /*输出结果*/
            }
            i++;
        }
                return 0;
    }                                            
}

xscj.zip (738 Bytes)

xscj的文件。
搜索更多相关主题的帖子: 文本文件 汉字 记录 键盘 
2016-06-11 14:32
唯光阿九
Rank: 2
等 级:论坛游民
帖 子:21
专家分:59
注 册:2016-6-10
收藏
得分:0 
忘了贴图了,囧
图片附件: 游客没有浏览图片的权限,请 登录注册
2016-06-11 14:40
唯光阿九
Rank: 2
等 级:论坛游民
帖 子:21
专家分:59
注 册:2016-6-10
收藏
得分:0 
(⊙o⊙)…忘了说了。。程序运行有问题。。每一次都是“文件中没有找到姓名为“%s”的学生”
我不知道是不是flag赋值出错了。。还是其他地方出了问题。。各位大神帮帮忙啊。。
2016-06-11 20:34
唯光阿九
Rank: 2
等 级:论坛游民
帖 子:21
专家分:59
注 册:2016-6-10
收藏
得分:0 
谢谢哈,有点不好意思了。。。新手,犯了这么大的基本性错误。但是我在你的指导下认真修改了下程序。
改成这个样子了,精简改短了很多,你看看。
程序代码:
#include <stdio.h>
#include <string.h>

typedef struct xuesheng
{
    int xuehao[3];
    char mingzi[20];
    char xingbie[5];
    char kemu[30];
    int chengji;
}DENGJI;

int main(void)
{
    FILE *fp;
    DENGJI chazhao[30];    
    char shuru[10];
    int i = 0, flag = 0, count = 0;

    fp = fopen("xscj.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
        return 0;
    }
    printf("请输入要查找成绩的学生姓名:");
    gets(shuru);                                           /前面都一样,只是多一个将i初始化为0了/
    while (!feof(fp))
    {
        fscanf(fp, "%s, %s, %s, %s, %d",
               chazhao[i].xuehao, chazhao[i].mingzi, chazhao[i].xingbie, chazhao[i].kemu, &chazhao[i].chengji);
        i++;
    }                                                       /这个循环就是给结构体里面所有成员全部初始化的,所以i就是一个循环计数,从一个数组成员跳到下一个元素/
    rewind(fp);                                            /重置指针位置,方便下一次循环/
    i = 0;
    while (!feof(fp))
    { 
        if (strcmp(chazhao[i].mingzi, shuru) == 0)
        {
            flag = 1;
            count++;
            printf("%d, %s, %s, %s, %s, %d\n",count, chazhao[i].xuehao, chazhao[i].mingzi, chazhao[i].xingbie, chazhao[i].kemu, chazhao[i].chengji);
        }
        i++;
    }                                                        /我在这里合并了判断与输出,flag赋值是只在判断成立时赋值了/
    if (flag == 0)                                                /如果上面一步不成立,就可以直接判断flag为0的情况了了/ 
    {
        printf("文件中没有找到姓名为“%s”的学生\n", shuru);
    }
    fclose(fp);                                                 /上面写的那个C忘了关闭指针。。/
    return 0;
}

但是我写完调试时发现结构体数组越界了。程序好像直接把一行的全部弄到一个结构数组成员里去了,而那第一个循环也成了一个死循环。最后造成数组越界。(好像是把空格及其之后的内容读到一个字符串数组里去了)文件里面是这个样子,这个怎么结决呢?
图片附件: 游客没有浏览图片的权限,请 登录注册
2016-06-12 01:01
唯光阿九
Rank: 2
等 级:论坛游民
帖 子:21
专家分:59
注 册:2016-6-10
收藏
得分:0 
回复 6楼 lanke711
这个每个人学习时的情况不一样吧。我脑壳比较笨。。。我的意思原本是这样的:如果可以的话,直接用指针在文件里寻找得到比较相同的位置,将当前位置用指针再次赋值到一个结构体或者一个字符串里都可以,但如你所见,楼主能力有限,很多地方不会。然后返回来用循环做的时候又想不出简单的方法了,这个样子写出来的时候其实我本身就有很多疑问,所以才来求教各路高手啦。。
2016-06-12 01:10
唯光阿九
Rank: 2
等 级:论坛游民
帖 子:21
专家分:59
注 册:2016-6-10
收藏
得分:0 
非常感谢各位大大帮忙,刚刚学习完文件,可能是我看书不仔细,有些细节没看到。。。囧。。。虽然分数不多,也是一点心意,感谢各位!!
2016-06-12 18:04
快速回复:新人上路,不懂就问。。大神求教!!
数据加载中...
 
   



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

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