文件输入int字符串c

时间:2013-11-23 04:50:19

标签: c function file-io

所以我现在遇到了我的程序问题。我试图让它打开文件计数行倒带然后通过文件来存储变量。 String String String int是文件的格式,但在计算行数后我遇到了问题。我可以将数字打印到屏幕上,然后在打印后立即出现seg故障。我不知道为什么

int countLines(FILE * fin){
int count=0;
char street[100];
char city[100];
char state[3];
int zip;

do{
    fgets(street, 100, fin);
    fgets(city, 100, fin);
    fgets(state, 3, fin);
    fscanf(fin, "%d\n", &zip);
    count++;
}while(!feof(fin));

rewind(fin);

return count;

}

lines=countLines(fin);是我调用函数的方式。我做错了什么?

2 个答案:

答案 0 :(得分:2)

非常使用这些功能之前,请勿将fgets()fscanf()混合。他们在一起打得不好。格式中的\n是一个空格,将匹配任意个连续空格,包括多个\n,空格,制表符等。

// fscanf(fin, "%d\n", &zip);

建议避免feof()并使用fgets()的返回值。

在尝试读取文件并且无法提供feof()之前,

char不会成立。这与“没有人离开时的真实”不同。示例:您阅读了文件的最后charfeof()仍然是假的。代码尝试读取更多(和失败)。 现在 feof()是真的。 (并且仍然是真的)。​​

以简单的方式计算线条并使用对称性。进一步考虑更多错误检查。将邮政编码行作为字符串阅读,然后将其解析为整数。

int countLines(FILE * fin){
  int count=0;
  char street[100];
  char city[100];
  char state[100];
  char zips[100];
  unsigned zip;

  while (fgets(street, sizeof street, fin) != NULL) {
    count++;
  }
  rewind(fin);

  if (count%4 != 0) Handle_LineCountNotMultipleof4();

  // You could return here, but let's read the file again and get the data.
  // This is likely part of OP's next step.
  for (int i=0; i<count; i += 4) {
    if ((NULL == fgets(street, sizeof street, fin)) ||
      (NULL == fgets(city,   sizeof city, fin)) ||
      (NULL == fgets(state,  sizeof state, fin)) ||
      (NULL == fgets(zips,   sizeof zips, fin)) ||
      (1 != sscanf(zips, "%u", &zip))) handle_error();
    // Remember street, city, state, still have an ending \n
    do_something(street, city, state, zip);
  }
  return count;
}

或者,要计算行数,请使用以下内容。如果你有很长的线条,那么阅读会出现一个奇怪的困难,所以我们一边检查一下。如果您更喜欢简单的答案,请将此line length内容拿出来。您可以使用Maxline+1作为缓冲区大小而不是固定的100。

  size_t Maxline = 0;
  size_t Curline = 0;
  int ch;
  while ((ch = fgetc(fin)) != EOF) {
    Curline++;
    if (ch == '\n') {
      count++;
      if (Curline > Maxline) MaxLine = Curline;
      Curline = 0;  
    }
  }
  if ((Maxline + 1) > 100) TroubleAhead() ; // Trouble with future (fgets(buf, 100, fin), use bigger buffers
  rewind(fin);

答案 1 :(得分:0)

fgets试图读取整行,而不只是一个单词,这似乎是你所希望的。 所以,你传递的缓冲区不够大,并且它们不会得到你的跳跃,并且你每3行增加一次计数,并且fscan通常不会读取一行,留下该行的遗骸干扰你的下一次阅读。

如果您想阅读单词,请使用%s尝试scanf。如果你想读取固定数量的字符,请尝试fread。