使用fscanf读取文件在c中不起作用?

时间:2016-11-16 16:40:51

标签: c pointers

int main(int argc, char **argv) {
    char *input = "input.txt";
    int *account;
    char **name;
    float *balance;
    int count;
    int check;

    if (argc < 4 || argc > 4) {
        printf("Insufficient arguments. Check your command line arguments\n");
        return 1;
    }
    count = atoi(*(argv + 2));
    name = malloc(sizeof(char) * 20 * count);
    account = malloc(sizeof(int) * count);
    balance = malloc(sizeof(float) * count);

    check = load_data(input, name, account, balance, count);
    if (check == 0) {
        printf("File cannot be open\n");
    }

    print_data(name, account, balance, count);

    free(name);
    return 0;
} 

//load data from input file the according arrays
int load_data(char *input, char **name, int *acct, float *amt, int n) {
    int *a = acct;
    float *b = amt;
    FILE *file = fopen("input.txt", "r");
    int i;

    if (file == NULL) {
        return 0;
    } else {
        for (i = 0; i < 9; i++, acct++, amt++) {
            fscanf(file, "%s %d %f", *(name + i), acct, amt);
        }
    }
    fclose(file);
    acct = a; //return pointer to original position
    amt = b;
    return 1;
}

//print data from arrays
void print_data(char **name, int *acct, float *amt, int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("%-10s%-13s%s\n", "Name", "Account No.", "Amount");
        printf("%-10s%-13d%7.2f\n", *(name + i), *(acct + i), *(amt + i));
    }
}

我有这个load_data函数,它假设从文件中读取并将数据值存储在不同的指针中,但由于某种原因,当我使用print_data函数打印出来时,指针包含所有null和0? (请使用指针算术而不是数组回答)

1 个答案:

答案 0 :(得分:1)

我希望你在调用函数之前没有正确地准备数组......下面的main函数将适用于你的代码:

int main(int argc, char* argv[]) {
    int n = 10;
    char ** name = malloc(n * sizeof(char*));
    int* acct = malloc(n * sizeof(int));
    float* amt = malloc(n * sizeof(float));
    for (int i = 0; i < n; i++) {
        // this is allocating some space for each line
        // this is quite bad you should range check.
        name[i] = malloc(256);
    }
    load_data("", name, acct, amt, n);
    print_data(name, acct, amt, n);
    // TODO: free everything
}
load_data中的

ab不是必需的,amtacct是“按值传递”,无需恢复他们的函数末尾的值。也就是说,当此函数仅返回“指向”的值时,将丢弃所有参数中的值。

示例input.txt文件:

Adam 1 900.9
Daniel 2  800.8
Joe 3       700.7
Foo 4 600.6
Bar 5 500.5
Alice 6 400.4
Bob 7 300.3
Nick 8 200.2
Eve 9 100.1

稍微改变你的代码后(见下文),上面的输入文件确实有效,这是我得到的输出:

$ ./test 5 5 5
Name      Account No.  Amount
Adam      1             900.90
Name      Account No.  Amount
Daniel    2             800.80
Name      Account No.  Amount
Joe       3             700.70
Name      Account No.  Amount
Foo       4             600.60
Name      Account No.  Amount
Bar       5             500.50

根据您在问题中提供的功能更新主要功能:

int main(int argc, char **argv) {
    char *input = "input.txt";
    int *account;
    char **name;
    float *balance;
    int count;
    int check;
    int i;

    if (argc < 4 || argc > 4) {
        printf("Insufficient arguments. Check your command line arguments\n");
        return 1;
    }
    count = atoi(*(argv + 2));
    name = malloc(sizeof(char *) * count);
    for (i = 0; i < count; i ++) {
        *(name+i) = malloc(20);
    }
    account = malloc(sizeof(int) * count);
    balance = malloc(sizeof(float) * count);

    check = load_data(input, name, account, balance, count);
    if (check == 0) {
        printf("File cannot be open\n");
    }

    print_data(name, account, balance, count);

    free(balance);
    free(account);
    for (i = 0; i < count; i++) {
        free(*(name+i));
    }
    free(name);
    return 0;
}

...也在load_data我将i < 9更改为i < n