2016-11-16 45 views
1
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? (请回答使用指针运算,而不是阵列)使用fscanf读取文件不在c中工作?

+3

这还不够回答。输入,名称,acct,amt初始化?你有没有检查malloc是否返回NULL?我看到你不检查fscanf读取多少个字符......还要将你的代码初始化所有参数 – Fefux

+1

你为所有这些值分配了内存吗?告诉我们你如何调用'load_data'。 – pat

+1

OT:'acct = a;'和'amt = b;'是无用的,因为函数仍然存在,并且它们的值会丢失。它们只是传递给函数的值的副本。 – alk

回答

1

我希望你有没有准备妥当数组调用函数之前...以下主要功能与您的代码工作:

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

+0

字符指针的'char ** name'数组中指针指向什么? –

+0

在这个例子中,char **名称是指向更多指针的指针。如果你稍后再看,你会看到名字数组被填充了n个指向n个内存块的指针(由malloc分配)用于load_data函数。 – tribeca

+0

我加了我的主要功能 – Gtt123