Code Bye

strtok函数问题,无法正确识别EOF

学生一枚!跟各位前辈不同啊,前来请教。
目标是从txt中读取一段以逗号为分隔符的字符串,分别存入结构体的子项之中
全代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char number[10];
char text[40];
char author[40];
char code[10];
}book;
book data[20];
int main(void)
{
int i=0;
char temp[200]={0};
FILE *in;
in=fopen(“a.txt”,”r”);
if(in==NULL){
printf(“not open file.”);
exit(1);
}
while(!feof(in)){
fgets(temp,200,in);
strcpy(data[i].number,strtok(temp,”,”));
strcpy(data[i].text,strtok(NULL,”,”));
strcpy(data[i].author,strtok(NULL,”,”));
strcpy(data[i].code,strtok(NULL,”\n”));

printf(“%s\t%s\t%s\t%s\n”,data[i].number,data[i].text,data[i].author,data[i].code);
i++;
}

fclose(in);
return 0;
}
经过测试,正确读全部行都没有问题,但是无法识别eof,导致程序报错。本人不太了解EOF具体是什么东西,本人猜测跟strtok函数把分隔符替换成\0有关。 本人用feof(fp)测试,明明到了文件的末尾,却没有正确识别,foef(in)的值仍然是0。希望能指导一下,谢谢。

解决方案

20

while(!feof(in)){
fgets(temp,200,in);
把这一小段逻辑改成:
while (1) {
fgets(temp, 200, in);
if (feof(in))
break;
或直接是
while (fgets(temp, 200, in)) {
试试。
原因就是fgets读完文件最后一行后,并未到达文件结尾(可以假想EOF还为读到),这时去测试feof为假;
然后fgets再去读,才知道文件结束(读到EOF),这时feof测试才为真。

40

本人猜是你的a.txt最后多了一个空行,删掉空行试试。
或改成下面这样:判断一下读到的字符数,假如是0的话就跳出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char number[10];
char text[40];
char author[40];
char code[10];
}book;
book data[20];
int main(void)
{
int i=0;
char temp[200]={0};
FILE *in; 
in=fopen("a.txt","r");
if(in==NULL){
printf("not open file.");
exit(1);
}
while(!feof(in)){
	memset(temp, 0, 200);
    fgets(temp,200,in);
	if(strlen(temp) == 0)
		break;
    strcpy(data[i].number,strtok(temp,","));
    strcpy(data[i].text,strtok(NULL,","));
    strcpy(data[i].author,strtok(NULL,","));
    strcpy(data[i].code,strtok(NULL,"\n"));
    
    printf("%s\t%s\t%s\t%s\n",data[i].number,data[i].text,data[i].author,data[i].code);
    i++;
}
   
   fclose(in);
   return 0;	 
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明strtok函数问题,无法正确识别EOF