c/c++语言开发共享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: %dn", 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, %dn", 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, "%dn", &interval) != 1) { fprintf(stderr, "Error parsing interval.n"); fclose(iF); return; } while (! feof(iF)) { cur = (P *)malloc(sizeof(P)); if (fscanf(iF, "%c %d %un",&cur->jobName, &cur->arrivalTime, &cur->execTime) != 3) { fprintf(stderr, "Error parsing line.n"); free(cur); break; } add_to_list(head,cur); } 

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

      以上就是c/c++开发分享C:sscanf问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/522960.html

      (0)
      上一篇 2020年12月11日
      下一篇 2020年12月11日

      精彩推荐