c语言新手求助大佬

「已注销」 2017-09-01 04:21:56
看视频写了这一个链表 然后在读取文件中的学生信息这里出现问题了

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
//学生数据域
struct Student
{
char name[10];
char num[12];
int score;
};
//学生结点
typedef struct Node
{
struct Student st;
struct Node* pNext;
}NODE, *PNODE;

//初始化全局变量 声明链表的头尾
PNODE g_pHead = NULL;
PNODE g_pTail = NULL;

//函数的声明(加分号)
//添加学生信息
void AddStuMsg(char* name, char* num, int score);
//显示命令
void ShowOrder();
//清空链表信息
void FreeLinkDate();
//查找学生信息
PNODE SearchStuDate(char* num);
//显示学生信息
void ShowStuDate(PNODE pTemp);
//显示所有学生信息
void ShwoAllStuDate();
//显示小命令
void SmallOrder();
//显示一个学生信息
void ShwoAllStuDate();
//删除学生信息
void DeleteStuDate();
//修改学生信息
void ReviseStuDate();
//保存学生信息
void SaveStuDate();
//读取学生信息
void ReadStuDate();


int main(void)
{
int nOrder = -1;
char name[10] = { '\0' };
char num[12] = { '\0' };
int score = -1;
int flag = 1;
PNODE pTemp = NULL;
int a;
ShowOrder();
while (flag)
{
printf("请输入指令(10查看指令) ");
scanf("%d", &nOrder);
switch (nOrder)
{
case 1:
//添加一个学生信息
printf("请输入学生学号 ");
scanf("%s", num);
printf("请输入学生姓名 ");
scanf("%s", name);
printf("请输入学生成绩 ");
scanf("%d", &score);

AddStuMsg(name, num, score);
break;
case 2:
printf("请输入要查询的学生学号 ");
scanf("%s", num);
pTemp = SearchStuDate(num);
printf("学号 姓名 成绩\n");
ShowStuDate(pTemp);
break;
case 3:
printf("请输入要删除的学生学号 ");
scanf("%s", num);
pTemp = SearchStuDate(num);
printf("学号 姓名 成绩\n");
ShowStuDate(pTemp);
printf("是否删除?(确定请输入1) ");
scanf("%d", &a);
if (1 == a)
{
DeleteStuDate(pTemp);
break;
}
else
{
break;
}
case 4:
printf("请输入要修改的学生学号 ");
scanf("%s", num);
pTemp = SearchStuDate(num);
printf("学号 姓名 成绩\n");
ShowStuDate(pTemp);
printf("是否修改?(确定请输入1) ");
scanf("%d", &a);
if (1 == a)
{
ReviseStuDate(pTemp);
break;
}
case 5:
ShwoAllStuDate();
break;
case 6:
SaveStuDate();
break;
case 7:
ReadStuDate();
break;
case 10:
ShowOrder();
break;
case 0:
flag = 0;
break;
default:
printf("你输入的指令有误\n");
}
}
SaveStuDate();
FreeLinkDate();
system("pause");
return 0;
}
void ShowOrder()
{
printf("***************学生信息管理系统*********************\n");
printf("***************系统操作指令如下*********************\n");
printf("*** 1 增加一个学生信息 ***\n");
printf("*** 2 查找指定学生的信息 ***\n");
printf("*** 3 删除指定学生的信息 ***\n");
printf("*** 4 修改指定学生的信息 ***\n");
printf("*** 5 显示所有学生的信息 ***\n");
printf("*** 6 保存学生信息到文件中 ***\n");
printf("*** 7 读取文件中的学生信息 ***\n");
printf("*** 0 退出系统 ***\n");
printf("****************************************************\n");
return;
}
//添加一个学生信息
void AddStuMsg(char* name, char* num, int score)
{
//创建一个结点
PNODE pNew = malloc(sizeof(NODE));
//检验参数合理性
if (NULL == name || NULL == num || score<0)
{
printf("学生信息输入有误\n");
return;
}
//逻辑

//结点赋值
strcpy(pNew->st.num, num);
strcpy(pNew->st.name, name);
pNew->st.score = score;
pNew->pNext = NULL;
//接在链表上
if (NULL == g_pHead || NULL == g_pTail)
{
g_pHead = pNew;
}
else
{
g_pTail->pNext = pNew;
}
g_pTail = pNew;
return;
}
//清空链表信息
void FreeLinkDate()
{
PNODE pTemp = g_pHead;
while (NULL != g_pHead)
{
//记录结点
pTemp = g_pHead;
//移动到下一个结点
g_pHead = g_pHead->pNext;
//删除结点
free(pTemp);
}
}
PNODE SearchStuDate(char* num)
{
PNODE pTemp = g_pHead;
int nOrder = -1;
int flag = 1;
//检验参数合理性
if (NULL == num || num <= 0)
{
printf("学号输入错误\n");
return NULL;
}
if (NULL == g_pHead)
{
printf("链表为空\n");
return NULL;
}
while (NULL != pTemp)
{
if (0 == strcmp(pTemp->st.num, num))
{
printf("查找成功\n");
return pTemp;
}
pTemp = pTemp->pNext;
}
printf("查无此结点\n");
return NULL;
}
void SmallOrder()
{
printf("*** 1.查看信息 ***\n");
printf("*** 2.修改信息 ***\n");
printf("*** 3.删除信息 ***\n");
printf("*** 4.插入信息 ***\n");
printf("*** 0.退出 ***\n");
return;
}
void ShowStuDate(PNODE pTemp)
{
printf("%s %s %d\n", pTemp->st.num, pTemp->st.name, pTemp->st.score);
return;
}
void DeleteStuDate(PNODE pNode)
{
//只有一个节点
if (g_pHead == g_pTail)
{
free(g_pHead);
g_pHead = NULL;
g_pTail = NULL;
}
//只有两个节点
else if (g_pHead->pNext == g_pTail)
{
if (g_pHead == pNode)
{
free(g_pHead);
g_pHead = g_pTail;
printf("删除成功\n");

}
else
{
free(g_pTail);
g_pTail = g_pHead;
g_pHead->pNext = NULL;
printf("删除成功\n");
}
}
else // >=3
{
PNODE pTemp = g_pHead;
//判断头
if (g_pHead == pNode)
{
//记住头
pTemp = g_pHead;
g_pHead = g_pHead->pNext;
free(pTemp);
pTemp = NULL;
printf("删除成功\n");
return; //结束
}

while (pTemp)
{
if (pTemp->pNext == pNode)
{
//删除
if (pNode == g_pTail)
{
free(pNode);
pNode = NULL;
g_pTail = pTemp;
g_pTail->pNext = NULL;
printf("删除成功\n");
return;
}
else
{
//记住要删除的节点
PNODE p = pTemp->pNext;
//链接
pTemp->pNext = pTemp->pNext->pNext;
//释放节点
free(p);
p = NULL;
printf("删除成功\n");
return;
}
}

pTemp = pTemp->pNext;
}
}
}
void ShwoAllStuDate()
{
PNODE pTemp = g_pHead;
printf("学号 姓名 成绩\n");
while (NULL != pTemp)
{
ShowStuDate(pTemp);
pTemp = pTemp->pNext;
}
}
void ReviseStuDate(PNODE pTemp)
{
if (NULL != pTemp)
{
char name[10];
char num[12];
int score;
printf("请重新输入学生学号 ");
scanf("%s", num);
strcpy(pTemp->st.num, num);
printf("请重新输入学生姓名 ");
scanf("%s", name);
strcpy(pTemp->st.name, name);
printf("请重新输入学生成绩 ");
scanf("%d", &score);
pTemp->st.score = score;
printf("修改成功\n");
}
return;
}
void SaveStuDate()
{
FILE* pFile = NULL;
PNODE pTemp = g_pHead;
char strbuf[30] = { 0 };
char strscore[10] = { 0 };
//判断链表是否为空
if (NULL == g_pHead)
{
printf("学生信息为空\n");
return;
}
//打开文件
pFile = fopen("StuDate.txt", "wb+");
//判断文件是否打开成功
if (NULL == pFile)
{
printf("文件打开失败\n");
return;
}
else
{
printf("保存成功\n");
}
//操作文件
while (pTemp)
{
//学号
strcpy(strbuf, pTemp->st.num);
strcat(strbuf, ".");
//姓名
//stccat 向strbuf字符串再接
strcat(strbuf, pTemp->st.name);
strcat(strbuf, ".");
//成绩
_itoa_s(pTemp->st.score, strscore, 10, 10);
strcat(strbuf, strscore);
// 要写入的字符串,一次写入的小块的字节,一个小块的字节,文件指针
fwrite(strbuf, 1, strlen(strbuf), pFile);
fwrite("\r\n", 1, strlen("\r\n"), pFile);
pTemp = pTemp->pNext;
}
fclose(pFile);
return;
}
void ReadStuDate()
{
char stubuf[30] = { 0 };
char stunum[10] = { 0 };
char stuname[10] = { 0 };
char stuscore[10] = { 0 };
FILE* pFile = fopen("StuDate.txt", "rb+");
int nCount = 0;
int j = 0;

if (NULL == pFile)
{
printf("文件打开失败\n");
return;
}
else
{
printf("读取成功\n");
}
//操作文件指针
while ( NULL!=fgets(stubuf, 30, pFile));
{
int i = 0;
nCount = 0;
j = 0;
for (i = 0; stubuf[i] != '\r'; i++)
{
//没到点
if (0 == nCount)
{
stunum[i] = stubuf[i];
if ('.' == stubuf[i])
{
stunum[i] = '\0';
nCount++;
}
}
//第一个点
else if (1 == nCount)
{
stuname[j] = stubuf[i];
j++;
if ('.' == stubuf[i])
{
stuname[j] = '\0';
nCount++;
j = 0;
}
}
else
{
stuscore[j] = stubuf[i];
j++;
}
}
//插入到链表
AddStuMsg(stuname, stunum, atoi(stuscore));
}
fclose(pFile);
}
最后这一段函数 我在文件中保存的信息是
1.2.3
4.5.6
7.8.9


但是fgets函数读取的时候 我用逐语句看的时候缓冲区从1.2.3到4.5.6都没有进入while循环 到了7.8.9才进入循环 所以最后只读取了7 8 9三个数 请问这是哪里出错了
...全文
227 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-09-04
  • 打赏
  • 举报
回复
引用 3 楼 qq_40088982 的回复:
大神们太厉害了,问一下int long和int short分别怎么用
建议查一下这个楼主的博客; http://blog.csdn.net/u012223913/article/details/51181761
qq_40088982 2017-09-03
  • 打赏
  • 举报
回复
大神们太厉害了,问一下int long和int short分别怎么用
自信男孩 2017-09-01
  • 打赏
  • 举报
回复
//删除学生信息
void DeleteStuDate(PNODE pNode);
//修改学生信息
void ReviseStuDate(PNODE pTemp);
函数声明需要添加参数,至少参数的类型需要加。
void ReadStuDate()
{
    char stubuf[30] = { 0 };
    char stunum[10] = { 0 };
    char stuname[10] = { 0 };
    char stuscore[10] = { 0 };
    FILE* pFile = fopen("StuDate.txt", "rb+");
    int nCount = 0;
    int j = 0;

    if (NULL == pFile)
    {
        printf("文件打开失败\n");
        return;
    }
    else
    {
        printf("读取成功\n");    /*这儿还没开始读呢*/
    }
    //操作文件指针
    while ( NULL!=fgets(stubuf, 30, pFile))    /*这儿应该去掉分号*/
    {
        int i = 0;
        nCount = 0;
        j = 0;
        for (i = 0; stubuf[i] != '\n'; i++)   /*此处应该是'\n',而不应该是'\r'*/
        {
            //没到点
            if (0 == nCount)
            {
                stunum[i] = stubuf[i];
                if ('.' == stubuf[i])
                {
                    stunum[i] = '\0';
                    nCount++;
                }
            }
            //第一个点
            else if (1 == nCount)
            {
                stuname[j] = stubuf[i];
                j++;
                if ('.' == stubuf[i])
                {
                    stuname[j] = '\0';
                    nCount++;
                    j = 0;
                }
            }
            else
            {
                stuscore[j] = stubuf[i];
                j++;
            }
        }
        //插入到链表
        AddStuMsg(stuname, stunum, atoi(stuscore));
    }
    fclose(pFile);
}
回车符应该是'\n'
Really_want 2017-09-01
  • 打赏
  • 举报
回复
while ( NULL!=fgets(stubuf, 30, pFile)); 加了分号,就等着读到最后一行后,再执行下面的语句吧。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧