2016-08-09 156 views
1

Ich habe Probleme mit dem Verständnis, wenn ich den Zeiger übergeben sollte und wenn das Ding darauf zeigt. in meinem Code:C - Öffnen einer Datei und Lesen von Char von Char mit Übergabe des Dateizeigers als Argument

int checkFile(FILE fp) 
{ 
int c; 
while((c = fgetc(*fp)) != EOF) 
{ 
    putchar(c); 
} 
fclose(*fp); 

} 
int main(int argc, char *argv[]) 
{ 

FILE *fp = fopen(argv[0], "r"); 
char fileName = argv[1]; 
if(argc > 2) 
{ 
    printf("Please supply a file!\n"); 
    printf("usage: CheckParenthesis <file name>\n"); 
} 
if (fp == NULL) 
{ 
    printf("Error! trying to open the file\n"); 
    return 1; 
} 
else 
{ 
    checkFile(fp); 
} 
return 0; 
} 

ich große Fehler kompilieren dies zu umgehen, ist der Fehler:

C:\Users\Dell\ClionProjects\CheckParenthesis\CheckParenthesis.c: In   function 'checkFile': 
C:\Users\Dell\ClionProjects\CheckParenthesis\CheckParenthesis.c:17:22: error:  invalid type argument of unary '*' (have 'FILE') 
while((c = fgetc(*fp)) != EOF) 
       ^
C:\Users\Dell\ClionProjects\CheckParenthesis\CheckParenthesis.c:21:12: error:  invalid type argument of unary '*' (have 'FILE') 
fclose(*fp); 
     ^
C:\Users\Dell\ClionProjects\CheckParenthesis\CheckParenthesis.c: In function 'main': 
C:\Users\Dell\ClionProjects\CheckParenthesis\CheckParenthesis.c:28:21: warning: initialization makes integer from pointer without a cast 
char fileName = argv[1]; 
       ^
C:\Users\Dell\ClionProjects\CheckParenthesis\CheckParenthesis.c:41:9: error: incompatible type for argument 1 of 'checkFile' 
    checkFile(fp); 
    ^
C:\Users\Dell\ClionProjects\CheckParenthesis\CheckParenthesis.c:12:5: note: expected 'FILE' but argument is of type 'struct FILE *' 

int checkfile (FILE fp)

Ich weiß, es gibt hier mehrere Problematiken, aber ich weiß nicht wissen, was richtig ist: 1. öffne ich das richtige Argument? beide argv [0] und argv [1] scheint der Dateipfad zu sein i .. Addiert man diese als Druck angegeben aus i für das Erhalten der argv Informationen gemacht: Test:

printf("There are %d args, %s, %s\n", argc,argv[0],argv[1]); 

Ergebnis:

There are 2 args,     C:\Users\Dell\.CLion2016.2\system\cmake\generated\CheckParenthesis- 5dc89373\5dc89373\Release\CheckPare 
nthesis.exe, C:\testing\brackets.txt 
  1. mache ich die richtige Zeigerverwendung?
+0

Sie müssen den Dateizeiger nicht dereferenzieren, wenn Sie als Argument übergeben – dvhh

+0

Und das Argument sollte übergeben werden als 'FILE *', nicht 'FILE'. Der Aufruf von 'main' ist property, aber die Funktion decl nicht. Es sollte 'int checkFile (FILE * fp)' – WhozCraig

+0

und 'char fileName = argv [1];' ist falsch, sollte es 'char * fileName = argv [1] sein;' – dvhh

Antwort

2

Puh! So sollte checkfile() einen Dateizeiger nicht eine Datei nehmen. Ändern int checkFile(FILE fp)-int checkFile(FILE* fp) und dann später in Ihrem während aussehen sollten Sie ändern jeden *fp-fp

Ihr Code soll wie folgt aussehen:

int checkFile(FILE* fp) { 
    int c; 
    while ((c = fgetc(fp)) != EOF) { 
     putchar(c); 
    } 
    fclose(fp); 
} 

int main(int argc, char *argv[]) { 
    FILE *fp = fopen(argv[0], "r"); 
    char* fileName = argv[1]; // thanks to dvhh in the comments 
    if (argc > 2) { 
     printf("Please supply a file!\n"); 
     printf("usage: CheckParenthesis <file name>\n"); 
    } 
    if (fp == NULL) { 
     printf("Error! trying to open the file\n"); 
     return 1; 
    } else { 
     checkFile(fp); 
    } 
    return 0; 
} 

, die helfen soll, auch kann ich sehen, wie Sie kompilieren? (vorausgesetzt, Sie verwenden gcc)

+1

ändern 'char fileName = argv [1];' zu 'char * fileName = argv [1];' – dvhh

+0

Danke das kompiliert !! – Eyzuky

+0

Ich benutze Clion .. also kompiliere ich durch dort. Das Problem, das jetzt besteht, ist, dass es Kauderwelsch anstelle des tatsächlichen Inhalts der Datei druckt. – Eyzuky