学生一枚!跟各位前辈不同啊,前来请教。
目标是从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”));
目标是从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测试才为真。
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的话就跳出
或改成下面这样:判断一下读到的字符数,假如是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; }