C++写一个txt查询时出错

写了一个按照学号Sno查询的程序,运行的时候都是打出最后一行,哪位大神帮我指正一下,感激不尽。

 #include<stdio.h>

#define N 1024
#define RECORDLENGTH 1000

struct Student         //定义基本表——Student
{
    long long int Sno;      //学生学号
    char Sname[20];    //学生姓名
    char Ssex[6];      //学生性别
    int Sage;          //学生年龄
    char Sdept[20];    //学生所在系
};

int main()
{
    FILE *fp;
    int n,i,num[N],m;
    char buffer[RECORDLENGTH+1];
    Student mp;
    if( fp=fopen("StudentData.txt","r"))
    {
        n=0;
        while (!feof(fp))
        {
            fgets(buffer,RECORDLENGTH+1,fp);
            sscanf(buffer,"%lld",num+n);
            n++;
        }
        printf("请输入序号:");
        scanf("%lld",&m);
        for( i=0;i<n;i++)
            if ( num[i]==m )
                break;
        if ( i<n )
        {
            fseek(fp, (long)i*RECORDLENGTH , (int)fp);
            fgets(buffer,RECORDLENGTH+1,fp);
            sscanf(buffer,"%lld %s %s %d %s",&mp.Sno,&mp.Sname,&mp.Ssex,&mp.Sage,&mp.Sdept);
            printf("学号  姓  名 性别 年龄 所在系\n");
            printf("%04lld %8s %4s %4d %4s\n",mp.Sno,mp.Sname,mp.Ssex,mp.Sage,mp.Sdept);
        }
        else
            printf("没有找到序号为%lld的记录。\n",num);
        fclose(fp);
    }
    else
    {
        printf("无法打开文件读取数据。\n");
        //exit();
    }
}

一下是StudentBase.txt里面的内容
2014010624 艾伦 男 19 IS
2014010413 郭宁 男 20 EN
2014010908 王凯 男 19 IS
2014021111 刘莉 女 19 EN
2014011536 陈军 男 21 IS
2014021314 赵爽 女 18 CA
2014010715 李宁 女 22 IS
2014010245 乔治 男 21 EN
2014021212 张雪 女 19 IS
2014021629 孙楠 男 23 CA
2014012231 马丁 男 20 CA

4个回答

把if ( num[i]==m )判断放到读文件的里面就可以了,找到num就break,然后再fseek一行,再输入就可以了

 #include<stdio.h>
#include<string.h>
#define N 1024
#define RECORDLENGTH 1000

struct Student         //定义基本表——Student
{
    long long int Sno;      //学生学号
    char Sname[20];    //学生姓名
    char Ssex[6];      //学生性别
    int Sage;          //学生年龄
    char Sdept[20];    //学生所在系
};

int main()
{
    FILE *fp;
    int n,i = 0,num[N];
    long long int m;
    char buffer[RECORDLENGTH+1];
    Student mp;
    if( fp=fopen("F:\\StudentData.txt","r"))
    {
        n=0;
        int size = 0;
        printf("请输入序号:");
        scanf("%lld",&m);
        while (!feof(fp))
        {
            fgets(buffer,RECORDLENGTH+1,fp);
            size = strlen(buffer);
            sscanf(buffer,"%lld",num+n);
            if (num[n]==m)
            {
                i = 1;
                break;
            }
            n++;
        }

        if ( i == 1 )
        {
            fseek(fp, -size-1 , SEEK_CUR);
            fgets(buffer,RECORDLENGTH+1,fp);
            sscanf(buffer,"%lld %s %s %d %s",&mp.Sno,&mp.Sname,&mp.Ssex,&mp.Sage,&mp.Sdept);
            printf("学号  姓  名 性别 年龄 所在系\n");
            printf("%04lld %8s %4s %4d %4s\n",mp.Sno,mp.Sname,mp.Ssex,mp.Sage,mp.Sdept);
        }
        else
            printf("没有找到序号为%lld的记录。\n",num);
        fclose(fp);
    }
    else
    {
        printf("无法打开文件读取数据。\n");
        //exit();
    }
}

yang004
engineer-yang 无语了,都找到了为什么不直接输出呢。
大约 4 年之前 回复

fseek的第三个参数是不是用错了?
第三个参数的几个用法:
SEEK_SET 既0 文件开头
SEEK_CUR 既1 文件当前位置
SEEK_END 既2 文件结尾

另外,第二个参数是移动多少个字节,确定一行是1000字节吗?

 for( i=0;i<n;i++)
            if ( num[i]==m )
                break;

这段代码是在干嘛??
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

qq423399099
小灸舞 回复yang004: 原来前面还有一段代码
大约 4 年之前 回复
yang004
engineer-yang 在保存的数组中查找输入的学号
大约 4 年之前 回复

要解决这个问题有三个方法:
第一个方法:把从文件读取的信息都保存起来,数据量不大的话就用结构体数组,数据量比较大可以考虑链表;
第二个方法:先输入要查询的学号,然后遍历文件,没读一行就判断一下,如果找到就输出;
第三个方法:在现在的程序上修改,查到学号之后,已经知道在第几行了,用fgets循环读取直到需要的那一行;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问