gpt4 book ai didi

C fscanf 输入格式

转载 作者:行者123 更新时间:2023-11-30 18:49:41 26 4
gpt4 key购买 nike

我有一个输入文件,其中包含以下格式的行:

 %s %d %d %d %lf %lf ... %lf\n

其中 double 值的数量未知,但对于我的计算,我仅接受其中的前 15 个

我无法弄清楚的问题是,当我到达这样的行时:

City0 28 2 2016 1 2 3 4 5 6 7 8 9 10
City1 28 2 2016 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
City2 1 3 2016 1 2 3 4 5

并且我正确地将各自的值分配给某个结构,我得到以下结果:

City0 28 2 2016 Number of measures: 10
City1 28 2 2016 Number of measures: 15
16 17 18 19 Number of measures: 1
City2 1 3 2016 Number of measures: 5

我如何阅读(无处可去)/忽略所有内容,直到读到行尾,然后像往常一样开始阅读下一行?我需要以下输出:

City0 28 2 2016 Number of measures: 10
City1 28 2 2016 Number of measures: 15
City2 1 3 2016 Number of measures: 5

我尝试过这个,但没有更多的想法:

i=0; char character;
while (fscanf(fp, "%s %d %d %d", c.name, &c[i].date.day,
&c[i].date.month, &c[i].date.year)==4 && i<number_of_cities) {
while (fscanf(fp, "%lf", &c[i].measures[j])==1 && j<15) {
j++;
}
if (j==15) {
while (fscanf(fp, "%s", character)!='\n') {}
}
c[i].mnum = j;
j=0;
i++;
}

最佳答案

您可以使用 fscanf() 读取整行输入,使用 sscanf() 扫描前四个值,并使用 sscanf( ) 再次循环读取 double 值。这里的技巧是使用 %n 指令来保存字符串中下一个读取位置的位置。

这是一个例子。请注意,size_t 用于数组索引,因为这是保证保存任何数组索引的无符号整数类型。另请注意,打开文件和扫描行开头时会进行一些错误检查。如果该行的初始元素与预期值不匹配,程序将退出并显示错误消息。这种错误检查可以加强一点;例如,如果年份以浮点值形式输入,例如 2016.0,则输入将被接受,但存储在 measures[] 中的值将以小数点后的0

#include <stdio.h>
#include <stdlib.h>

struct Data {
char name[1000];
struct {
int day;
int month;
int year;
} date;
size_t mnum;
double measures[15];
};

int main(void)
{
size_t i = 0, j = 0;
char buffer[1000];
char *read_ptr = buffer;
int n_read = 0;

size_t number_of_cities = 3;

struct Data c[number_of_cities];

FILE *fp;
if ((fp = fopen("datafile.txt", "r")) == NULL) {
fprintf(stderr, "Unable to open file\n");
exit(EXIT_FAILURE);
}

while (fgets(buffer, 1000, fp) != NULL) {
if (sscanf(buffer, "%s %d %d %d %n", c[i].name, &c[i].date.day,
&c[i].date.month, &c[i].date.year, &n_read) != 4) {
fprintf(stderr, "Incorrect input format\n");
exit(EXIT_FAILURE);
}
read_ptr += n_read;
while (sscanf(read_ptr, "%lf %n", &c[i].measures[j], &n_read) == 1 &&
j < 15) {
read_ptr += n_read;
++j;
}
c[i].mnum = j;
++i;
j = 0;
read_ptr = buffer;
if (i == number_of_cities) {
break;
}
}

for (i = 0; i < number_of_cities; i++) {
printf("%s %d %d %d Number of measures: %zu\n",
c[i].name,
c[i].date.day, c[i].date.month, c[i].date.year,
c[i].mnum);
for (j = 0; j < c[i].mnum; j++) {
printf("%5g", c[i].measures[j]);
}
putchar('\n');
}

return 0;
}

使用示例数据作为输入的程序输出:

City0 28 2 2016 Number of measures: 10
1 2 3 4 5 6 7 8 9 10
City1 28 2 2016 Number of measures: 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
City2 1 3 2016 Number of measures: 5
1 2 3 4 5

关于C fscanf 输入格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42140938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com