在写一个学生选课系统,从文件中读取数据的时候有时候多读一行,有时候又不多读。用的链表。分辨贴上两段代码,前者为删去多读的最后一个节点。后者为未删去多读的最后一个节点。
求指教错误出在哪里。
/*定义三个链表首节点*/
struct student_link *stu = NULL;
struct teacher_link *tea = NULL;
struct course_link *cou = NULL;
char eat = ' ';
/*文件的定义及读取*/
FILE *fpsr = fopen("/Users/qb/Documents/C语言程序设计/2015.9.10/data/student.txt", "r");
struct student_link *pNew;
struct student_link *p;
struct student_link *q;
struct student_link *pTail = NULL;
while (!feof(fpsr))
{
pNew = (struct student_link *) malloc (sizeof(struct student_link));
fscanf(fpsr ,"%s%c%s%c%s%c%s%c%s%c%c%c%s%c%s%c%s%c%s%c%s%c", pNew->stu_id, &eat, pNew->stu_code, &eat, pNew->name, &eat, pNew->academy, &eat, pNew->major, &eat, &pNew->sex, &eat, pNew->tel_num, &eat, pNew->email, &eat, pNew->course[0], &eat, pNew->course[1], &eat, pNew->course[2], &eat);
if (student_rHead == NULL)
student_rHead = pNew
else
pTail->pNext = pNew;
pTail = pNew;}
pTail->pNext = NULL;
/*连接链表*/
p = student_rHead;
q = student_rHead;
while (p->pNext != NULL)
{
q = p;
p = p->pNext;
}
free (p);
q->pNext = NULL;
stu = student_rHead;
图为第二段代码
但当所读取文件为空文件时,会自动填充一行空语句,然后下次再读入的时候就会多一行空白数据。还有就是,有没有什么好的方法能够让文件在一行内读取多个数据,我用了\t来输出到文件中,然后定义一个char eat;变量来吞掉读入内存的\t和\n,但这样在数据操作时偶尔会碰到错误。有没有什么好的方法呢?
追答增加 fscanf 返回值的判断。 fscanf 返回 成功读入的参数个数
stat = fscanf(...);
这里加上对 stat 的判断,个数不符合要求,表示读有错。
fscanf 是 有格式 读,\t \n 这些都算 空白,会 自动 略去。
按行读文件和处理文件,可以 用 fgets() 读一行,存入字符数组 char buff[1024];
然后 你 处里 buff 的 字符,根据需要 爱怎么处理就怎么处理,是不是空行很容易判断,
strlen(buff) 是 0 就是空的,若是 \t\n 可以查字符。或不需要处理。
然后用 sscanf( buff,"...",...); 的方法 读出 数据(格式就是 fscanf 里的那套东西)。