如何 return 一个 FILE* fp 从一个函数到我的 main in c

How to return a FILE* fp from a function to my main in c

你好,我在 C 中练习文件处理,我尝试编写一个关于删除注释的代码。 我使用 main.c、functions.c 和 functions.h .

main.h

#include <stdio.h>
#include <stdlib.h>
#include "functions.c"

int main(void) {

    FILE *in ,*out;
    char c;

    if ((in = fopen("input_file.c", "r")) == NULL ) {
        printf("Error opening \"file1.txt\" for reading\n");
        exit(1);
    }
    if ((out = fopen("input_file.nocmments.c","w")) == NULL ) {
        printf("Error opening \"file2.txt\" for writing\n");
        exit(2);
    }
    while((c = getc(in)) != EOF) {
        if(c == '/') comment(c, in, out);
        else if (c == '\'' || c == '\"') quotes(c, in, out);
        else print(c, out);
    }
    fclose(in);
    fclose(out);
    return 0;
}

function.c(我只展示一部分,因为其他功能也有同样的问题

int one_line(char ch, FILE* fpin, FILE* fpout) {
    while ((ch = getc(fpin)) != '\n');
    fputc(ch, fpout);
    return ch, fpin, fpout; <-- error here
}

function.h

int comment(char ch, FILE* fpin, FILE* fpout);
int one_line(char ch, FILE* fpin, FILE* fpout);
int multiline(char ch, FILE* fpin, FILE* fpout);
int quotes(char ch, FILE* fpin, FILE* fpout);
int print(char ch, FILE* fpout);

所以当我编译代码时,我收到以下警告

returning ‘FILE *’ {aka ‘struct _IO_FILE *’} from a function with return type ‘int’ makes integer from pointer without a cast [-Wint-conversion]

我知道我不能 return typedef 这就是我遇到以下问题的原因,但是我如何 return 文件指针指向我的主要功能? (对不起,如果我的问题很愚蠢)

int one_line(char ch, FILE* fpin, FILE* fpout) {
    while ((ch = getc(fpin)) != '\n');
    fputc(ch, fpout);
    return ch, fpin, fpout; <-- error here
}

C 有一些棘手或令人困惑的细节。逗号运算符就是其中之一。

    return ch, fpin, fpout;

这是有效的 C 代码。逗号运算符在 C11 第 6.5.17 节中定义,它说:

The left operand of a comma operator is evaluated as a void expression; there is a sequence point between its evaluation and that of the right operand. Then the right operand is evaluated; the result has its type and value.

在您的示例中,这意味着:

  • 首先,表达式 ch 被求值,由于它没有任何副作用,因此被忽略。
  • 其次,fpin 也被评估和忽略。
  • 第三,fpout 被评估并从函数中 returned。

fpout的类型是FILE *,函数的return类型是int,这些类型不匹配,这是编译器的地方警告来自。

您应该将代码更改为 return ch

您不需要 return 函数中的文件,即使您修改了它们。这里的重点是您没有将实际文件传递给函数,而是将 指针 传递给文件。