2016-08-09 23 views
1

我在理解何时应该传递指针以及何时指向它的东西时遇到问题。在我的代码:C - 打开文件并通过传递文件指针作为参数读取char字符

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; 
} 

我得到重大失误编译此,错误是:

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(文件FP)

我知道有几个问题群在这里,但我不知道什么是正确的: 1.我打开正确的论点?两者的argv [0]和argv [1]似乎是我所指定的文件路径..添加此作为打印出我用于获取的argv信息制成: 试验:

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

结果:

There are 2 args,     C:\Users\Dell\.CLion2016.2\system\cmake\generated\CheckParenthesis- 5dc89373\5dc89373\Release\CheckPare 
nthesis.exe, C:\testing\brackets.txt 
  1. 我在做正确的指针用法吗?
+0

当你作为参数传递时,你不需要解引用文件指针 – dvhh

+0

而参数应该作为'FILE *'而不是'FILE'传递。从'main'调用的是propert,但函数decl不是。它应该是'int checkFile(FILE * fp)' – WhozCraig

+0

和'char fileName = argv [1];'是错误的,它应该是'char * fileName = argv [1];' – dvhh

回答

2

唷!所以checkfile()应该采取文件指针而不是文件。更改int checkFile(FILE fp)int checkFile(FILE* fp)再后来在看的同时,你应该改变任何*fpfp

您的代码应该是这样的:

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; 
} 

这应该帮助,我也能看到你是如何编制? (假设你正在使用gcc)

+1

更改'char fileName = argv [1];'到'char * fileName = argv [1];' – dvhh

+0

感谢编译! – Eyzuky

+0

我使用Clion ..所以我编译通过那里。现在的问题是它打印乱码而不是文件的实际内容。 – Eyzuky

相关问题