我试图扫描文件" 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 €
答案 0 :(得分:1)
所以你不会迷路....
mas = (sask *)realloc(mas, *sk * sizeof(sask));
如果要返回结果,则需要发送一个sask ** mas,而不是发送的sask * mas。由于realloc更新了指针,因此需要检索新的指针值(可能)。
答案 1 :(得分:1)
重新设计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;
}
我不怀疑修改后的代码中也有可以改进的东西。