2013-11-25 210 views
0

我被分配做一個項目,從文件中讀取,並根據它輸入字符是它具有以下值這樣做,如果它讀取+將添加下一個兩個數字,或者如果它的H它會打印出說明。我無法將結果打印到另一個文件中我將指針傳遞給每個函數,如下所示void add(int a, int b, FILE *print),並按以下方式調用它:add(a, b, printer),在我嘗試打印到文件之前它工作正常。在功能上添加我得到的是錯誤...編程指針問題

error : incompatible type for argument 1 of fprintf 
expected 'struct FILE *' but argument is of type 'FILE' 

這種情況發生過我的所有功能。

這是代碼。謝謝 !

#include <stdio.h> 
#include <stdlib.h> 

void add(int a, int b, FILE *print); 
void add(int a, int b, FILE *print) 
{ 
    int c; 
    c = a + b; 
    printf("%i + %i = %i\n\n", a, b, c); 
    fprintf(*print, "%i + %i = %i\n\n", a, b, c); 
} 
void subtract(int a, int b, FILE *print); 
void subtract(int a, int b, FILE *print) 
{ 
    int c; 
    c = a - b; 
    printf("%i - %i = %i\n\n", a, b, c); 
    fprintf(*print, "%i - %i = %i\n\n", a, b, c); 
} 
void multiply(int a, int b, FILE *print); 
void multiply(int a, int b, FILE *print) 
{ 
    int c; 
    c = a * b; 
    printf("%i * %i = %i\n\n", a, b, c); 
    fprintf(*print, "%i * %i = %i\n\n", a, b, c); 
} 
void divide(int a, int b, FILE *print); 
void divide(int a, int b, FILE *print) 
{ 
    double c; 
    c = (double)(a/b); 
    printf("%i - %i = %.1lf\n\n", a, b, c); 
    fprintf(*print, "%i - %i = %.1lf\n\n", a, b, c); 
} 
void help(FILE *print); 
void help(FILE *print) 
{ 
    printf("+ i j [Integer Add]\t\tAdds integers i and j and print out result\n\n"); 
    printf("* i j [Integer Multiply]\tMultiply integers i and j and print out result\n\n"); 
    printf("- i j [Integer Subtract ]\tSubtract integer j from i and print out result\n\n"); 
    printf("/ i j [Integer Divide ]\t\tDivide integer i by j and print out result of integer division\n\n"); 
    printf("H [Help ]\t\t\tPrint a short synopsis of all the available commands\n\n"); 
    printf("Q [Quit ]\t\t\tQuit\n\n"); 
    printf("\n\n"); 
    fprintf(*print, "+ i j [Integer Add]\t\tAdds integers i and j and print out result\n\n"); 
    fprintf(*print, "* i j [Integer Multiply]\tMultiply integers i and j and print out result\n\n"); 
    fprintf(*print, "- i j [Integer Subtract ]\tSubtract integer j from i and print out result\n\n"); 
    fprintf(*print, "/ i j [Integer Divide ]\t\tDivide integer i by j and print out result of integer division\n\n"); 
    fprintf(*print, "H [Help ]\t\t\tPrint a short synopsis of all the available commands\n\n"); 
    fprintf(*print, "Q [Quit ]\t\t\tQuit\n\n"); 
    fprintf(*print, "\n\n"); 
} 
char quit(void); 
char quit(void) 
{ 
    char user; 
    printf("Do you really want to quit?(y/n): "); 
    scanf(" %c", &user); 
    return user; 
} 

int main() 
{ 

char trigger; 
char user; 
char fname; 
char lname; 
int a; 
int b; 

FILE *myPointer; 
FILE *printer; 
myPointer = fopen("CommandsProj1.dat", "r"); 
printer = fopen("results.dat", "w"); 

if (myPointer == NULL) 
{ 
    printf("error opening the file"); 
    fprintf(printer, "error opening the file"); 
} 
else 
{ 
    fscanf(myPointer, " %c%c", &fname, &lname); 
    printf("Initials %c%c\n\n\n", fname, lname); 

    while(user != 'y') 
    { 
     fscanf(myPointer, " %c", &trigger); 
     switch(trigger) 
     { 
      case '+': 
        fscanf(myPointer, "%i%i", &a,&b); 
        add(a,b,myPointer); 
        break; 
      case '-': 
        fscanf(myPointer, "%i%i", &a, &b); 
        subtract(a,b,myPointer); 
        break; 
      case '/': 
        fscanf(myPointer, "%i%i", &a,&b); 
        divide(a,b,myPointer); 
        break; 
      case '*': 
        fscanf(myPointer, "%i%i", &a,&b); 
        multiply(a,b,myPointer); 
        break; 
      case 'H': 
        help(myPointer); 
        break; 
      case 'Q': 
        user = quit(); 
     } 
    } 
} 

return 0; 
} 
+3

做的錯誤說,改變*打印在打印fprintf中。 –

回答

2

你提領該FILE *fprintf。這是沒有必要的(甚至是錯誤的),因爲fprintf需要一個指針。印刷線路更改爲:

fprintf(print, ...); 
0

我認爲你必須更換*帶打印打印不僅是因爲它是通過爲ppointer

0

的問題是關於fprintf(*print,...);

我覺得你沒區別定義和聲明聲明中的**處於解除引用聲明中。

考慮以下代碼段:

int a=10; 
int *p =a; 
printf("%d",*p); 

int *p =a;,這是一個定義語句,在這裏*表明p是一個指針。

printf("%d",*p);,還有一個*p之前,但在這裏它是一個運營商,它獲得的價值,其中P點(a的值10在這裏)。

所以fprintf(...);第一個參數應該是一個指針,不是指針指向。那麼你應該使用print你傳入的指針。

2

如果更改所有*打印在函數fprintf調用打印,然後一切都會好起來。

完整的工作守則

#include <stdio.h> 
#include <stdlib.h> 

void add(int a, int b, FILE *print); 
void add(int a, int b, FILE *print) 
{ 
    int c; 
    c = a + b; 
    printf("%i + %i = %i\n\n", a, b, c); 
    fprintf(print, "%i + %i = %i\n\n", a, b, c); 
} 
void subtract(int a, int b, FILE *print); 
void subtract(int a, int b, FILE *print) 
{ 
    int c; 
    c = a - b; 
    printf("%i - %i = %i\n\n", a, b, c); 
    fprintf(print, "%i - %i = %i\n\n", a, b, c); 
} 
void multiply(int a, int b, FILE *print); 
void multiply(int a, int b, FILE *print) 
{ 
    int c; 
    c = a * b; 
    printf("%i * %i = %i\n\n", a, b, c); 
    fprintf(print, "%i * %i = %i\n\n", a, b, c); 
} 
void divide(int a, int b, FILE *print); 
void divide(int a, int b, FILE *print) 
{ 
    double c; 
    c = (double)(a/b); 
    printf("%i - %i = %.1lf\n\n", a, b, c); 
    fprintf(print, "%i - %i = %.1lf\n\n", a, b, c); 
} 
void help(FILE *print); 
void help(FILE *print) 
{ 
    printf("+ i j [Integer Add]\t\tAdds integers i and j and print out result\n\n"); 
    printf("* i j [Integer Multiply]\tMultiply integers i and j and print out result\n\n"); 
    printf("- i j [Integer Subtract ]\tSubtract integer j from i and print out result\n\n"); 
    printf("/ i j [Integer Divide ]\t\tDivide integer i by j and print out result of integer division\n\n"); 
    printf("H [Help ]\t\t\tPrint a short synopsis of all the available commands\n\n"); 
    printf("Q [Quit ]\t\t\tQuit\n\n"); 
    printf("\n\n"); 
    fprintf(print, "+ i j [Integer Add]\t\tAdds integers i and j and print out result\n\n"); 
    fprintf(print, "* i j [Integer Multiply]\tMultiply integers i and j and print out result\n\n"); 
    fprintf(print, "- i j [Integer Subtract ]\tSubtract integer j from i and print out result\n\n"); 
    fprintf(print, "/ i j [Integer Divide ]\t\tDivide integer i by j and print out result of integer division\n\n"); 
    fprintf(print, "H [Help ]\t\t\tPrint a short synopsis of all the available commands\n\n"); 
    fprintf(print, "Q [Quit ]\t\t\tQuit\n\n"); 
    fprintf(print, "\n\n"); 
} 
char quit(void); 
char quit(void) 
{ 
    char user; 
    printf("Do you really want to quit?(y/n): "); 
    scanf(" %c", &user); 
    return user; 
} 

int main() 
{ 

char trigger; 
char user; 
char fname; 
char lname; 
int a; 
int b; 

FILE *myPointer; 
FILE *printer; 
myPointer = fopen("CommandsProj1.dat", "r"); 
printer = fopen("results.dat", "w"); 

if (myPointer == NULL) 
{ 
    printf("error opening the file"); 
    fprintf(printer, "error opening the file"); 
} 
else 
{ 
    fscanf(myPointer, " %c%c", &fname, &lname); 
    printf("Initials %c%c\n\n\n", fname, lname); 

    while(user != 'y') 
    { 
     fscanf(myPointer, " %c", &trigger); 
     switch(trigger) 
     { 
      case '+': 
        fscanf(myPointer, "%i%i", &a,&b); 
        add(a,b,myPointer); 
        break; 
      case '-': 
        fscanf(myPointer, "%i%i", &a, &b); 
        subtract(a,b,myPointer); 
        break; 
      case '/': 
        fscanf(myPointer, "%i%i", &a,&b); 
        divide(a,b,myPointer); 
        break; 
      case '*': 
        fscanf(myPointer, "%i%i", &a,&b); 
        multiply(a,b,myPointer); 
        break; 
      case 'H': 
        help(myPointer); 
        break; 
      case 'Q': 
        user = quit(); 
     } 
    } 
} 

return 0; 
}