c语言从文件中读数据有时多一行,有时不多。

在写一个学生选课系统,从文件中读取数据的时候有时候多读一行,有时候又不多读。用的链表。分辨贴上两段代码,前者为删去多读的最后一个节点。后者为未删去多读的最后一个节点。
求指教错误出在哪里。
/*定义三个链表首节点*/

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;
图为第二段代码

while (!feof(fpsr)){ 读,计数或输出} -- 这是中国c语言教科书普遍的错误。
检查 文件是否 读到 EOF ,应当在 读语句执行以后,因为读语句 执行后才会返回 文件状态,设文件标志(是否到达 EOF, 是否有读的错误)。所以 判断 是否 EOF 要在读 以后,计数和输出以前。

正确的次序是:
while (1){
读;
if (feof(fpsr) ) break; // 及时 结束
计数或输出
}追问

但当所读取文件为空文件时,会自动填充一行空语句,然后下次再读入的时候就会多一行空白数据。还有就是,有没有什么好的方法能够让文件在一行内读取多个数据,我用了\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 里的那套东西)。

温馨提示:答案为网友推荐,仅供参考
相似回答