[英]Using fscanf in a function in C
我正在尝试使用以下方法扫描文件“data.txt”:
void read_file(int *sk, sask mas[]){
FILE *data = fopen("data.txt", "r");
if (data != NULL){
fscanf(data, "%d", sk);
printf("%d", *sk);
realloc(mas, *sk * sizeof(sask));
for(int i = 0; i < *sk; i++){
fscanf(data, "%s%s%d%lf%s", mas[i].vard, mas[i].pav, &mas[i].num, &mas[i].suma, mas[i].val);
}
}
fclose(data);
}
但我甚至无法获得显示要读取多少行的第一个数字。 我不知道我在这里做错了什么。
我正在调用这样的函数:
int sk;
sask *mas = malloc(1 * sizeof(sask));
read_file(&sk, mas);
这是我正在使用的结构:
typedef struct sask {
char vard[256];
char pav[256];
int num;
double suma;
char val[5];
} sask;
data.txt:
4
name1 surname1 12345678 1000000.00 €
name2 surname2 87654321 -123456.00 $
name3 surname3 13572468 543636.00 $
name4 surname4 86849854 -13233222.00 €
所以你不要迷路......
mas = (sask *)realloc(mas, *sk * sizeof(sask));
如果要返回结果,则需要发送一个sask ** mas,而不是发送的sask * mas。由于realloc更新了指针,因此需要检索新的指针值(大概)。
重新设计read_file()
函数:
sask *read_file(const char *file, int *sk)
{
FILE *data = fopen(file, "r");
*sk = 0;
if (data == NULL)
return 0;
if (fscanf(data, "%d", sk) != 1)
{
fclose(data);
return 0;
}
printf("file %s: records = %d\n", file, *sk);
sask *mas = malloc(*sk * sizeof(*mas));
if (mas == 0)
{
*sk = 0;
fclose(data);
return 0;
}
for (int i = 0; i < *sk; i++)
{
if (fscanf(data, "%s%s%d%lf%s", mas[i].vard, mas[i].pav,
&mas[i].num, &mas[i].suma, mas[i].val) != 5)
{
*sk = i;
break;
}
printf("%d: %s %s %d %f %s\n", i, mas[i].vard, mas[i].pav,
&mas[i].num, &mas[i].suma, mas[i].val);
}
fclose(data);
return mas;
}
像这样调用它:
int sk;
sask *mas = read_file("data.txt", &sk);
if (mas == 0 || sk == 0)
...oops!...
这段代码只有一个fclose()
因为它使用了一个额外的函数。 错误处理得到更好的控制。
static sask *read_data(FILE *data, int *sk)
{
if (fscanf(data, "%d", sk) != 1)
return 0;
printf("records = %d\n", *sk);
sask *mas = malloc(*sk * sizeof(*mas));
if (mas == 0)
return 0;
for (int i = 0; i < *sk; i++)
{
if (fscanf(data, "%s%s%d%lf%s", mas[i].vard, mas[i].pav,
&mas[i].num, &mas[i].suma, mas[i].val) != 5)
{
*sk = i;
break;
}
printf("%d: %s %s %d %f %s\n", i, mas[i].vard, mas[i].pav,
&mas[i].num, &mas[i].suma, mas[i].val);
}
return mas;
}
sask *read_file(const char *file, int *sk)
{
sask *mas = 0;
*sk = 0;
FILE *data = fopen(file, "r");
if (data != NULL)
{
mas = read_data(data, sk);
fclose(data);
}
return mas;
}
我不怀疑在修订后的代码中也有可以改进的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.