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

标签 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)
{
    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 检查文件(FILE 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. 我的指针使用是否正确?

最佳答案

呸!所以 checkfile() 应该采用文件指针而不是文件。将 int checkFile(FILE fp) 更改为 int checkFile(FILE* fp) 然后稍后在您的 while 中查看您应该将任何 *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;
}

这应该有帮助,我能看看你是如何编译的吗?(假设你使用的是 gcc)

关于C - 打开一个文件并逐个读取一个字符,并将文件指针作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38846583/

相关文章:

Java:如何在不分配完整内存的情况下计算从 InputStream 读取的字节数

c - 从 C 文件中获取矩阵

c - LibUSB 驱动程序问题 : timeout

c - 使用C查找文件权限

stream - 从 Dart 中的流创建新流

java - 使用 CSV2TableLayout 解析 CSV 但出现问号

c - 为什么没有打印任何内容? C语言编程

c - 内核模块中的 rand() 和 sleep() 是如何制作的?

python - 计算一个文件夹中多个文本文件中的 "something"

python - 使用 python 在文件中的关键字之间查找值