C从文件中读取字符串和int

时间:2017-04-29 23:25:16

标签: c string file

为了简短起见,该程序应该从格式为“int string”的文件中读取,例如“5利物浦(新线)2曼彻斯特”并在屏幕上打印内容。问题发生在第4次(总共5次)迭代中,程序崩溃了。我想更好的方法是使用诸如gets之类的函数,但是,这是针对C中的入门级类,所以我很确定这些函数没有被课程所涵盖。在你研究它之前,我在fscanf上使用了与另一个问题相同的原理,并且它完美地工作(但文件被格式化为“string int”)。任何帮助将非常感激。感谢。

#include<stdio.h>
#include<stdlib.h>
int main()
{
  FILE *dat;
  FILE *dat1;
  dat = fopen("ekipe.txt", "r");
  int ek[5], bd[5], i = 0, t1, t2, g1, g2;
  char im[5][10];
  for(i = 0; i < 5; i++)
    bd[i] = 0;
  if(dat)
    while(!feof(dat))
    {
      fscanf(dat, "%d %s\n", &ek[i], &im[i]);
      printf("%d %s\n", ek[i], im[i]);
      i++;
    }

  fclose(dat);
  system("PAUSE");
  return 0;
}

1 个答案:

答案 0 :(得分:1)

for(i = 0; i < 5; i++)
    bd[i] = 0;

此处,变量i取自05

在循环之后,仍然是5

所以,你的下一个循环:

while(!feof(dat))
{
  fscanf(dat, "%d %s\n", &ek[i], &im[i]);
  printf("%d %s\n", ek[i], im[i]);
  i++;
}

总是在你的数组边界上运行。

这似乎是“偶然”工作四次,可能与您在函数中声明的变量有关(在堆栈中创建空间并阻止操作系统检测到内存访问冲突),或者至少阻止其他更低级别的构造被覆盖在内存中,造成进一步的痛苦)。但是,从根本上说,此循环中的每次访问都会被破坏,因为现在i5转移到10

您需要重置i

如果您使用调试器逐步执行程序,您会注意到这一点。

此外,您的输入长度为11个字符,包括终止空字节,但您只剩下10个空间(char im[5][10])。

最后,不要像这样运行I / O循环。在执行任何I / O之前检查EOF是没有意义的。相反,请检查fscanf的返回值是否成功。