c-通过引用传递流



我想通过引用传递stream,它是一个指针。所以我把它作为一个指针传递给一个指针。有人能验证我的代码吗?

    int main(int argc, char** argv)
{
    FILE *stream;
    printf("LINES: %dn",scan(stream));
}
int scan(FILE *(*stream))
{
    stream = fopen("names.txt", "r");
    int ch = 0, lines=0;
    while (!feof(*stream))
    {
        ch = fgetc(*stream);
        if (ch == 'n')
        {
            lines++;
        }
    }
    fclose(*stream);
    return lines;
}

未收到输出。

您的代码存在设计问题。你到底想实现什么?

如果您只想计算行数,请将FILE *设置为您的函数的本地值:

int count_lines(const char *filename)
{
    FILE *stream = fopen(filename, "r");
    int lines = 0;
    while (1) {
        int c = fgetc(stream);
        if (c == EOF) break;
        if (c == 'n') lines++;
    }
    fclose(stream);
    return lines;
}

如果您想对已经用fopen打开的文件执行常规文件操作(读取、写入、查找、倒带等),只需将句柄传递为FILE *:

int fget_non_space(FILE *stream)
{
    int c;
    do {
        c = fgetc(stream);
    } while (isspace(c));
    return c;
}

在这种情况下,fopenfclose都在此函数之外调用。(即使操作系统确保在退出后自动关闭文件,也不应该在程序中调用fclose。)

只有当您想在函数中更改文件句柄本身时,传递指向文件句柄FILE **的指针才有意义,例如通过调用fopen:

int fopen_to_read(FILE **FILE pstream, const char *fn) 
{
    *pstream = fopen(fn, "r");
    return (*pstream != NULL) ? 0 : -1;        
}

即便如此,最好还是像fopen那样返回文件句柄。

您的示例代码使打开的文件句柄可以在main中访问,但您没有对它做任何操作,甚至没有关闭它。这就是您想要的吗?我对此表示怀疑。

使用

int scan(FILE **stream) //no need for brackets
{
    *stream = fopen("names.txt", "r"); //* is for dereferencing
    if(*stream==NULL) // Checking the return value of fopen
    {
        printf("An error occured when opening 'names.txt'");
        return -1;
    }
    int ch = 0, lines=0;
    while ((ch = fgetc(*stream))!=EOF) //while(!feof) is wrong
    {
        if (ch == 'n')
        {
            lines++;
        }
    }
    fclose(*stream); // Close the FILE stream after use
    return lines;
}
int main(void)
{
    FILE *stream;
    printf("LINES: %dn",scan(&stream)); //Pass address of `stream`. The address is of type `FILE**`
}

更换

stream = fopen("names.txt", "r");

带有

*stream = fopen("names.txt", "r");

还有

printf("LINES: %dn",scan(stream));

带有

printf("LINES: %dn",scan(&stream));

相关内容

  • 没有找到相关文章

最新更新