繁体   English   中英

在C中的函数中使用fscanf

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM