我正在尝试从以;
格式化的文件中读取数据。
数据将始终是这样的:
char[];int;int%;int
char[]
可以有任意数量的空格,并且%
在读取数据时应该被忽略。
我正在使用fscanf()
(仅允许使用它)从文件中读取数据。
现在我在那部分代码是:
fscanf(file, "%[^;]%d%d%d", f_name, &f_id, &f_score, &f_section_num) != EOF)
是否有我需要的正则表达式?或者,如何纠正我的fscanf
?
答案 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()
。