如何 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 函数中的文件,即使您修改了它们。这里的重点是您没有将实际文件传递给函数,而是将 指针 传递给文件。
你好,我在 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 函数中的文件,即使您修改了它们。这里的重点是您没有将实际文件传递给函数,而是将 指针 传递给文件。