2016-11-16 98 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