【问题标题】:How to return a FILE* fp from a function to my main in c如何在 c 中将 FILE* fp 从函数返回到我的 main
【发布时间】:2021-11-24 20:10:24
【问题描述】:

您好,我练习 C 中的文件处理,并尝试编写有关删除 cmets 的代码。 我使用 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
}

函数.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]

我知道我无法返回 typedef,这就是我遇到以下问题的原因,但是如何将文件指针返回到我的主函数? (对不起,如果我的问题很愚蠢)

【问题讨论】:

  • 你只能从 C 函数返回 一个 东西。看起来 fpinfpout 是输入。你为什么要退货?
  • 事实上,看起来你的函数根本不需要返回任何东西。
  • @Max 如果 OP 尝试创建一个最小的可重现示例并且具有相同问题的其他功能需要所描述的功能,我不会感到惊讶
  • @Max 这实际上是关键问题,谢谢
  • 当你说“我明白我不能返回typedef”时,我怀疑你的意思是你认为你不能返回一个结构。 typedef 是一个关键字,而不是类型类别,尽管有些人习惯使用它来定义结构类型的别名,但实际上它从来没有用于任何目的。无论如何,是的,您可以返回一个结构。唯一不能返回的类型是函数和数组,尽管你可以返回指向它们的指针。

标签: c file-handling


【解决方案1】:
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 节中定义,其中说:

逗号运算符的左操作数被评估为 void 表达式; 在它的评估和正确的评估之间有一个序列点 操作数。然后对右操作数求值;结果有它的类型和值。

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

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

fpout的类型是FILE *,函数的返回类型是int,这些类型不匹配,这就是编译器警告的来源。

您应该将代码更改为简单的return ch

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

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 2020-09-19
    • 2017-05-06
    • 2021-09-21
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2015-07-18
    • 2015-01-07
    相关资源
    最近更新 更多