在C中的函数中使用fscanf

时间:2014-05-13 16:48:52

标签: c function scanf

我试图扫描文件" 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 €

2 个答案:

答案 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;
}

我不怀疑修改后的代码中也有可以改进的东西。