c - 如何在此处使用 fscanf 从文件写入变量



我正在尝试读取一个带有单行"00:612:33188"的文件"data.txt"(每个数字代表一个数据字段,"changes:size:permission"(,并将该信息写入结构中。我想为这些字段中任意数量的字符编写代码。

我的问题是关于 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 datann");
       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("%sn%sn%sn", total[total_elements].changes,
    total[total_elements].size, total[total_elements].permission);
    fclose (fp);
  }
  return 0;
}

"%s"格式读取空格分隔的字符串。如果没有空间,它会贪婪地阅读尽可能多的内容。

在您的情况下,这意味着整行将位于changes字段中,其余成员未初始化。

对于非空格分隔的记录,您可以将整行读取到一个字符串中,然后在分隔符上进行标记。

错误的罪魁祸首可能是巨大的局部变量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,你的代码文件适用于我的测试。

相关内容

  • 没有找到相关文章

最新更新