如何使用的fscanf这里写为可变的文件吗?

问题描述 投票:1回答:2

我试图读取文件“data.txt中”与单行“00:612:33188”(每个数字代表数据的领域,“变化:尺寸:许可”),并写信息到一个结构。我想写一般的代码在这些领域的任何数目的字符。

我的问题是关于使用的fscanf的。我似乎无法使它发挥作用。下面的代码产生一个分段错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXHITS 50
#define FIELDMAX 100
#define TOTALELEMENTS 100000

typedef struct Elements{
  char changes[FIELDMAX];
  char size[FIELDMAX];
  char permission[FIELDMAX];
} Elements;

int main(int argc, char const *argv[]) {
  if(argc < 2) {
       printf("\nSyntax: fscanf data\n\n");
       exit(EXIT_FAILURE);
  }

  Elements total[TOTALELEMENTS];
  Elements hits[MAXHITS];
  int total_elements = 0;
  int total_hits = 0;
  FILE *fp;

  // open the file and scan each field copying to the corresponding struct
  fp = fopen (argv[1], "r");

  if (fp){

    fscanf(fp,"%99s:%99s:%99s", total[total_elements].changes,
    total[total_elements].size, total[total_elements].permission);

    printf("%s\n%s\n%s\n", total[total_elements].changes,
    total[total_elements].size, total[total_elements].permission);

    fclose (fp);
  }

  return 0;
}
c stream segmentation-fault scanf
2个回答
1
投票

该段错误的可能的罪魁祸首是巨大的局部变量total

#define MAXHITS 50
#define FIELDMAX 100
#define TOTALELEMENTS 100000

typedef struct Elements{
  char changes[FIELDMAX];
  char size[FIELDMAX];
  char permission[FIELDMAX];
} Elements;

int main () {
...
  Elements total[TOTALELEMENTS];
}

100000个* 300字节。你得到调用堆栈溢出。如果减少TOTALELEMENTS,比方说,100,你的代码的工作文件,我的测试。


3
投票

"%s"格式读取空间分隔的字符串。如果没有空间,它会贪婪地读着一样,因为它可以。

在你的情况下,它意味着整条生产线将在changes场,留下其余成员初始化。

对于非空间分隔的记录,你可以读取整个行成一个字符串,然后在隔板上tokenize

© www.soinside.com 2019 - 2024. All rights reserved.