如何将文件中的特定字符串保存到C中的变量中

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

因此,例如,如果我有一个包含以下内容的文件:

STUDENTS: Three
NAME 1: Andy
NAME 2: Becky
NAME 3: Chris
TYPE: Undergrads

我想将学生的姓名提取到一个数组中。

[我尝试使用fscanf来实现这一点,例如,它可以工作,并且我可以将“ Three”保存到学生结构中:

fscanf(fptr, "STUDENTS: %s\n", student.count);

因此,我尝试了一些变化(其中count是文件中的行数),但是names数组仍然为空:

int *num = NULL;
*num = 1;
int j;
for (j=0; j<count; j++) {
   if (j != 0 && j != count-1) {
       fscanf(fptr, "NAME %d: %s\n", num, student.names[j]);
       *num+=1;
   }
}

是否有比fscanf更好的方法,例如我不太熟悉的fseek()。任何想法将不胜感激,谢谢。

编辑:

struct Students {

  char *name;
  char *type;
  char *connections[6];

};

struct Students student;
c file c-strings
1个回答
2
投票

scanf系列功能不适用于扫描具有可变格式的行。在这种情况下,一种合理的方法是首先将输入行扫描为用冒号分隔的标记和字符串值。

char tag[MAX_TAG_SIZE], value[MAX_VALUE_SIZE];
if (fscanf(f, "%[^:]: %s ", tag, value) != 2) error("bad line format");

此格式字符串将:以外的任何其他字符转换成tag。然后,它跳过:,后跟空白。然后,它将一个非空格的单词输入value,然后跳过空格(包括换行符)。最后一位使输入准备好扫描下一个标签,这一点很重要。新C程序员使用scanf犯的最大错误是忘记正确处理输入流中的空格。

现在您可以检查标签以查看下一步做什么:

if (strcmp("STUDENTS", tag) == 0) {
   ... Handle students value
} else if(strcmp("TYPE", tag) == 0) {
   ... Handle type value
} else if (strncmp("NAME", tag, 4) == 0) {
    if (sscanf(tag + 4, "%d", &name_number) != 1) error("bad name number");
    ... Handle name_number and value
} else error("unexpected tag");
© www.soinside.com 2019 - 2024. All rights reserved.