C:sscanf问题

我有这样的文本文件:

2
A 10 5
B 31 2
C 6 6

我想读一个变量中的第一个行号
并在3个变量中读取每行的空格分隔的3个值列表。 我写了这段代码:

iF=fopen(fileName,"r"); fgets(tmp,255,iF); sscanf(tmp,"%d",&interval); while(!feof(iF)){ cur=(P *)malloc(sizeof(P)); fgets(tmp,255,iF); sscanf(tmp,"%c %d %d",&Name,&AT,&ET); cur->jobName=Name; cur->arrivalTime=AT; cur->execTime=ET; add_to_list(head,cur); } 

它适用于1,3,4线,但不适用于2号线! 在第2行它什么都没有存储! 当我在调试器中检查时,文件中有一些奇怪的字符(\ 342 \ 200 \ 252),我不知道它们来自哪里!?

有什么问题?

谢谢

嗯…我希望看到最后一行有问题,但是随便看不出为什么你应该在其他地方遇到问题。 OTOH,至少当我解决你(试图)检测文件结尾的明显问题时,它似乎对我来说很好:

 #include  #include  typedef struct P { char jobName; int arrivalTime; int execTime; } P; void show_P(P const *r) { printf("Name: %c, Arrival Time: %d, Execute Time: %d\n", r->jobName, r->arrivalTime, r->execTime); } int main() { int interval; char Name; int AT, ET; char tmp[256]; FILE *iF=fopen("stupid_input.txt","r"); fgets(tmp,255,iF); sscanf(tmp,"%d",&interval); while(fgets(tmp, 255, iF)){ P *cur=malloc(sizeof(P)); sscanf(tmp,"%c %d %d",&Name,&AT,&ET); cur->jobName=Name; cur->arrivalTime=AT; cur->execTime=ET; show_P(cur); } return 0; } 

结果:

 Name: A, Arrival Time: 10, Execute Time: 5 Name: B, Arrival Time: 31, Execute Time: 2 Name: C, Arrival Time: 6, Execute Time: 6 

以下代码适用于我:

 #include  #include  int main(void) { const char *fileName = "data.txt"; FILE *iF; int interval; char Name[256], tmp[256]; int AT, ET; iF = fopen(fileName, "r"); if (fgets(tmp, 255, iF) == NULL) goto error; if (sscanf(tmp, "%d", &interval) != 1) goto error; while (fgets(tmp, 255, iF) != NULL) { if (sscanf(tmp, "%c %d %d", Name, &AT, &ET) != 3) goto error; fprintf(stdout, "%s, %d, %d\n", Name, AT, ET); } return 0; error: fprintf(stderr, "error while reading from the file.\n"); return 1; } 

请注意有多少代码专用于error handling。 这是必要的。

要调试此问题,请执行一些简单的调试步骤:

进入tmp ,尝试将其打印出来,看看它是否符合您的预期。

您应该存储并显示sscanf的返回值,以查看它是否成功。

您看到的字符(\ 342 \ 200 \ 252)是226,128和170的八进制。这些字符不会映射到您不小心在输入文件中键入的字符。 我的建议是用hex编辑器检查你的输入文件,看看那里是否有垃圾。

如果没有,您可以尝试更改读取文件的方式,以查看代码中是否存在故障,例如,您可以尝试使用fscanf(通常不是首选):

 FILE *iF = fopen("input.txt", "r"); if (fscanf(iF, "%d\n", &interval) != 1) { fprintf(stderr, "Error parsing interval.\n"); fclose(iF); return; } while (! feof(iF)) { cur = (P *)malloc(sizeof(P)); if (fscanf(iF, "%c %d %u\n",&cur->jobName, &cur->arrivalTime, &cur->execTime) != 3) { fprintf(stderr, "Error parsing line.\n"); free(cur); break; } add_to_list(head,cur); } 

但是,由于其他人已经发布了几种适用于它们而不适合您的方法,因此输入文件肯定是错误的候选者。