C-打开一个文件并逐字符读取,并将文件指针作为参数传递

C-打开一个文件并逐字符读取,并将文件指针作为参数传递,c,file,stream,C,File,Stream,我很难理解何时应该传递指针以及指针指向的对象。在我的代码中: 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) { print

我很难理解何时应该传递指针以及指针指向的对象。在我的代码中:

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;
}
int检查文件(文件fp)

我知道这里有几个问题,但我不知道什么是正确的: 1.我的论点正确吗?argv[0]和argv[1]似乎都是我指定的文件路径。。将此添加为我为获取argv信息而制作的打印输出: 测试:

结果:

    There are 2 args,                    C:\Users\Dell\.CLion2016.2\system\cmake\generated\CheckParenthesis-    5dc89373\5dc89373\Release\CheckPare
nthesis.exe, C:\testing\brackets.txt
  • 我的指针使用是否正确
  • 呸!所以
    checkfile()
    应该使用文件指针,而不是文件。将
    int checkFile(FILE fp)
    更改为
    int checkFile(FILE*fp)
    ,然后在稍后的while look中,您应该将任何
    *fp
    更改为
    fp

    您的代码应该如下所示:

    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;
    }
    
    int检查文件(文件*fp){
    INTC;
    而((c=fgetc(fp))!=EOF){
    普查尔(c);
    }
    fclose(fp);
    }
    int main(int argc,char*argv[]){
    文件*fp=fopen(argv[0],“r”);
    char*fileName=argv[1];//感谢评论中的dvhh
    如果(argc>2){
    printf(“请提供一个文件!\n”);
    printf(“用法:检查括号\n”);
    }
    如果(fp==NULL){
    printf(“错误!试图打开文件\n”);
    返回1;
    }否则{
    检查文件(fp);
    }
    返回0;
    }
    

    这应该会有所帮助,我还可以看看您是如何编译的吗?(假设您使用的是gcc)

    当作为参数传递时,您不需要取消对文件指针的引用,并且参数应该作为
    file*
    传递,而不是
    file
    。从
    main
    调用是正确的,但函数decl不是。它应该是
    int checkFile(FILE*fp)
    char fileName=argv[1]
    错误,应该是
    char*fileName=argv[1]为什么要打开argv[0]?argv[0]是可执行文件。您可能需要使用argv[1]谢谢它现在一切正常!!更改
    charfilename=argv[1]
    to
    char*fileName=argv[1]谢谢你编译的很好!!我用克莱恩。。所以我在那里编译。现在的问题是它打印的是乱七八糟的内容,而不是文件的实际内容。@Eyzuky您希望它打印什么?我确实建议使用gcc或Visual Studio。另外,我认为clion是付费使用的。
    
        There are 2 args,                    C:\Users\Dell\.CLion2016.2\system\cmake\generated\CheckParenthesis-    5dc89373\5dc89373\Release\CheckPare
    nthesis.exe, C:\testing\brackets.txt
    
    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;
    }