读取以';'分隔的数据从文件

时间:2018-09-07 20:53:02

标签: c file parsing

我正在尝试从以;格式化的文件中读取数据。 数据将始终是这样的:

char[];int;int%;int

char[]可以有任意数量的空格,并且%在读取数据时应该被忽略。

我正在使用fscanf()(仅允许使用它)从文件中读取数据。
现在我在那部分代码是:

fscanf(file, "%[^;]%d%d%d", f_name, &f_id, &f_score, &f_section_num) != EOF)

是否有我需要的正则表达式?或者,如何纠正我的fscanf

3 个答案:

答案 0 :(得分:2)

您可以使用fscanf并使用以下格式的字符串来读取文件:

"%[^;];%d;%d%%;%d"
  • %[^;]:最多先阅读;
  • ;:忽略;
  • %d:读取一个整数
  • ;:忽略;
  • %d:读取一秒钟的整数
  • %%:忽略%
  • ;:忽略;
  • %d:读取三分之一整数

不要忘记通过测试fscanf来测试fscanf(...) == 4进行的成功转化次数

因此代码如下:

FILE *f = fopen(...);
char name[64];
int i, integers[3];

while (fscanf(f, "%[^;];%d;%d%%;%d", name, &integers[0], &integers[1], &integers[2]) == 4)
{
    printf("name is %s\n", name);
    for (i = 0; i < 3; ++i)
    {
        printf("i[%d] = %d\n", i, integers[i]);
    }        
}
fclose(f);

答案 1 :(得分:0)

以下代码将允许您从文件中读取由;分隔的数据:

char msg[100];
int  a;
char b[100];
int  c;

fscanf(fptr, "%[^;];%d;%[^;];%d", msg, &a, b, &c);
printf("%s\n %d\n %d\n %d\n", msg, a, atoi(b), c);

答案 2 :(得分:0)

您也可以使用strtok()。例如,如果您对每个条目使用以下结构,

typedef struct {
    char name[64];
    int id, score, section_num;
} entry_t;

以下内容将按如下所示读取文件的每一行。

char line[128] = {'\0'};
char *field = NULL;
entry_t entry;

while (fgets(line, sizeof(line), fp)) {
    field = strtok(line, ";");
    if (!field || strlen(field) > sizeof(entry.name)) continue;
    strcpy(entry.name, field);
    field = strtok(NULL, ";");
    if (!field) continue;
    entry.id = atoi(field);
    field = strtok(NULL, ";%");
    if (!field) continue;
    entry.score = atoi(field);
    field = strtok(NULL, ";");
    if (!field) continue;
    entry.section_num = atoi(field);
    // Do whatever you need with the entry - e.g. print its contents
}

为简洁起见,我删除了一些必要的样板代码。有关完整示例,请参见http://codepad.org/lg6BJ0hk

如果需要检查整数转换的结果,可以使用strtol()代替atoi()