Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在这里使用fscanf从文件写入变量?_C_Stream_Segmentation Fault_Scanf - Fatal编程技术网

如何在这里使用fscanf从文件写入变量?

如何在这里使用fscanf从文件写入变量?,c,stream,segmentation-fault,scanf,C,Stream,Segmentation Fault,Scanf,我试图读取一个文件data.txt,其中只有一行00:612:33188,每个数字代表一个数据字段,changes:size:permission,并将该信息写入一个结构。我想为这些字段中任意数量的字符编写代码 我的问题是关于fscanf的使用。我似乎无法使它工作。以下代码生成分段错误 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXHITS 50 #define F

我试图读取一个文件data.txt,其中只有一行00:612:33188,每个数字代表一个数据字段,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 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;
}
%s格式读取以空格分隔的字符串。如果没有空间,它会贪婪地阅读尽可能多的内容

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

对于非空格分隔的记录,您可以将整行读取为字符串,然后在分隔符上执行操作。

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

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


对于非空格分隔的记录,您可以将整行内容读入字符串,然后在分隔符上进行分隔。

SEGFULT的可能罪魁祸首是巨大的局部变量total

100000*300字节。您会得到调用堆栈溢出。
如果您将TOTALELEMENTS减少到100,那么您的代码将与我的测试文件一起工作

SEGFULT的罪魁祸首可能是巨大的局部变量总和

100000*300字节。您会得到调用堆栈溢出。
如果您将TOTALELEMENTS减少到100,那么您的代码将与我的测试文件一起工作

99的目的是什么?SIGSEGV的原因很可能是:@nicomp,因为我认为fscanf是如何工作的。FIELDMAX是100,我想在第100位,fscan会写一个“\0”99是干什么的?SIGSEGV的原因很可能是:@nicomp,因为我认为fscanf是如何工作的。FIELDMAX是100,我认为在第100位,fscan会写一个“\0”或作为数字数据读取,那么:,就可以工作了。如果需要,您始终可以将其转换回0填充字符串。或者将其读取为数字数据,则:将起作用。如果需要,您始终可以转换回0填充字符串。
#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];
}