Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
C文件输入fscanf问题(崩溃)_C_File_Input - Fatal编程技术网

C文件输入fscanf问题(崩溃)

C文件输入fscanf问题(崩溃),c,file,input,C,File,Input,正如标题所说,当调用beolvas()时,我当然会崩溃。你可能明白我想做的,这也很简单。我正在使用mingw32 btw。提前感谢您的帮助 typedef struct { int kerSzam; int voteCount; char *lastName; char *firstName; char *party; } Vote; void beolvas(Vote t[], int *n) { FILE *in; in = fope

正如标题所说,当调用beolvas()时,我当然会崩溃。你可能明白我想做的,这也很简单。我正在使用mingw32 btw。提前感谢您的帮助

typedef struct
{
    int kerSzam;
    int voteCount;
    char *lastName;
    char *firstName;
    char *party;
} Vote;

void beolvas(Vote t[], int *n)
{
    FILE *in;
    in = fopen("szavazatok.txt", "r");

    while(!feof(in))
    {
        fscanf(in,
               "%d %d %s %s %s\n",
               &t[*n].kerSzam,
               &t[*n].voteCount,
               t[*n].lastName,
               t[*n].firstName,
               t[*n].party
               );

        (*n)++;
    }

    fclose(in);
}
szavazatok.txt如下所示:

2 53 first last zed
1 5 first last pet
...

正如@Jean-Baptiste Yunès所评论的,需要为字符串分配内存

建议测试
fscanf()
的结果


您必须为结构的char*成员分配一些内存…需要进一步的帮助吗?
void beolvas(Vote t[], int *n, int maxn) {
  FILE *in;
  in = fopen("szavazatok.txt", "r");
  if (in) {
    char lastName[50];
    char firstName[50];
    char party[50];
    int cnt = 0;

    // spaces not needed in format, but widths are very useful
    while(*n < maxn && (cnt = fscanf(in, "%d%d%49s%49s%49s", 
        &t[*n].kerSzam, &t[*n].voteCount, lastName, firstName, party)) == 5) {
      t[*n].lastName = strdup(lastName);     
      t[*n].firstName = strdup(firstName);     
      t[*n].party = strdup(party);     
      (*n)++;
    }

    fclose(in);
  }
}
char *strdup(const char *src) {
  if (src) {
    size_t size = strlen(src) + 1;
    char *p = malloc(size);
    if (p) {
      return memcpy(p, src, size);
    }
  }
  return 0;
}