繁体   English   中英

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

[英]Reading file using fscanf is not working in c?

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函数打印出来时,指针包含所有空值和 0? (请使用指针算术而不是数组回答)

我希望您在调用函数之前没有正确准备数组......下面的主函数将与您的代码一起使用:

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_dataab不是必需的,因为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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